Как изменить автоматический вход с пользователя root на пользователя без прав root?

Как изменить автоматический вход с пользователя root на пользователя без прав root?

Я установил Ubuntu server 16.04 (на самом деле это 3.4.113-sun8i ) с Openbox. и поместил эту команду startxвнутрь /etc/rc.local, чтобы иметь графику после загрузки. но проблема в том, что он автоматически входит в систему как пользователь root, и из-за этого моя программа C++ работает неправильно (как я уже спрашивал, они говорят, что это потому, что пользователь root не может автоматически запускать некоторые библиотеки, такие как pulseaudio или gtk). И я думаю, что это правильно, потому что я должен запускать их вручную.

Кстати, я ищу способ изменить автологин с пользователя root на обычного пользователя. Как это сделать?

EDIT: моя цель — создать гаджет, пользователи которого могут включать/выключать только физической кнопкой (я имею в виду отсутствие меню, опций и т. д.). Гаджет должен выполнить мой код C++ после загрузки, а код использует библиотеки gtk и pulseaudio.

решение1

Ты мне сказал вдругой комментарийчто ваша система показывает это:

$ systemctl get-default
graphical.target

Итак, измените это на multi-user.target:

$ sudo systemctl set-default multi-user.target

А multi-user.target запустится на tty1 (Ctrl+Alt+F1):

$ systemctl list-dependencies multi-user.target | grep getty
● ├─getty.target
● │ ├─getty-static.service
● │ └─[email protected]

Итак, переопределяем файл tty1:

$ sudo systemctl edit getty@tty1

С этим содержимым (это mваше имя пользователя):

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin m %I $TERM

/sbin/agettyуказанный выше путь может отличаться в вашей системе, убедитесь, что вы указали правильный путь с помощью:

$ type -a agetty
agetty is /sbin/agetty
agetty is /sbin/agetty

Нажмите Esc, затем shift+ z+ , zчтобы сохранить и выйти (эти клавиши предназначены для vim, вы можете запустить их ps aв другой вкладке терминала во время редактирования, чтобы узнать , какая команда является символической ссылкой в ​​моей системе, ваша система может отличаться).editor /etc/systemd/system/[email protected]/.#override.blahblaheditorvim.gtk3

$ type -a editor
editor is /usr/bin/editor
editor is /usr/bin/editor
$ realpath /usr/bin/editor 
/usr/bin/vim.gtk3

Затем щелкните getty@tty1и перейдите вниз, вы увидите, что просто добавьте эти строки, чтобы создать эффект переопределения:

$ sudo systemctl cat getty@tty1 
 ...
# /etc/systemd/system/[email protected]/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin xiaobai %I $TERM

Автоматический вход в систему выполняется --autologinописанным выше способом, в противном случае вам придется вручную вводить имя пользователя и пароль для входа в tty1 после загрузки.

После входа в tty1 с именем пользователя mбудет выполнен /home/m/.profile, поэтому добавьте эту строку в конец вашего файла /home/m/.profile:

echo "$DISPLAY" > /tmp/hole1
echo "$XDG_VTNR" > /tmp/hole2
if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]; then
  echo lolo > /tmp/hole3
  exec startx -- -nocursor
fi
echo lili > /tmp/hole4

/tmp/holeNВышеприведенный пример предназначен только для отладки, чтобы знать, что он работает должным образом. Например, если /tmp/hole3он не создан, но /tmp/hole2был создан, это означает, что вам необходимо cat /tmp/hole2проверить значение «$XDG_VTNR».

startxзатем выполним /home/m/.xinitrc, отредактируем его:

$ cat /home/m/.xinitrc                                                                                                                             
#!/usr/bin/env bash                                                                                                                                   
echo 55 > /tmp/test1
exec openbox-session
echo 55 > /tmp/test2

openbox-sessionзатем выполнится /home/m/.config/openbox/autostart, отредактируйте его как обычно:

$ cat /home/m/.config/openbox/autostart 
echo 7 > /tmp/yy
/home/m/img &
echo 8 > /tmp/yy2

В конце концов, перезагрузка приведет вас к отображению вашего изображения напрямую, инструкцию выше можно обобщить следующим образом:

многопользовательский.target -> tty1 -> запустить[email protected]-> ExecStart автоматический вход в систему с желаемым именем пользователя -> вошедший в систему выполнит ~/.profile -> exec startx-> startx выполнит ~/.xinitrc-> exec openbox-session -> openbox выполнит ~/.config/openbox/autostart-> /home/m/img &откроется всплывающее окно.

[ОБНОВЛЯТЬ]

Я общаюсь с ОП вчат-комната(транскрипт) и решил свою проблему.

rc.local может startx, потому что rc.local запускает startx как root, но ~/.profile не запускает startx как root. Мы делаем это, startx > /tmp/my.log 2>&1чтобы убедиться, что startx работает правильно, затем /tmp/my.log покажет, что нам нужно проверить /home/m/.local/share/xorg/Xorg.0.log, и в конце концов я заметил, что первым (EE)является (EE) open /dev/fb8: Permission denied.

OP необходимо добавить пользователя mв группу видео, чтобы получить разрешение при запуске x на доступ к нужному FRAMEBUFFER /dev/fb8.

sudo usermod -a -G audio m
sudo usermod -a -G video m

ссылка1,ссылка2

p/s: Интересно, нужно ли добавлять в аудиогруппу выше.ссылка

решение2

/etc/rc.localвыполняется как пользователь root. Таким образом, вы должны использовать su -l jdoe -c startxin rc.local, предполагая, jdoeчто это пользователь, от имени которого вы хотите запустить Xorg.

Сомневаюсь, что у вас есть systemd, потому что systemd по умолчанию игнорирует все, rc.localесли только вы не обновились с предыдущей версии, в которой не было systemd, и даже в этом случае я не уверен... Я не использую systemd.

Если у вас есть systemd, вам нужно создать файл unit для этого. Для этого есть много ресурсов в сети.

Я поискал в Google по запросу «systemd unit file» и нашел следующее: Поместите следующее в файл: /etc/systemd/system/autologin.service(предполагается, что systemd находится именно там в вашей системе)

[Unit]
Description=Autologin service

[Service]
Type=fork
user=jdoe
group=users
ExecStart=/path/to/your/startx
TimeoutSec=0

[Install]
WantedBy=multi-user.target

Вам придется адаптировать блок, несколько .... вы, вероятно, не хотите запускать X как jdoe, а как другой пользователь. Также, usersвозможно, это не группа, членом которой является пользователь, и последнее, но не менее важное, /path/to/your/startxэто не путь к вашему startx... запустите which startx, чтобы узнать путь.

Далее запускаете sudo systemctl daemon-reloadперезагрузку конфигурации и перезагружаетесь.

EDIT (после комментариев автора):

Вы хотите это:

[Unit]
Description=Autologin service

[Service]
Type=fork
user=m
group=m
ExecStart=/usr/bin/startx
TimeoutSec=0

[Install]
WantedBy=multi-user.target

Если предположить, что вы startxнаходитесь в /usr/bin/startx, то это «должно» сработать.

решение3

Начните с удаления startxиз /etc/rc.local, затем выясните, какой у вас дисплейный менеджер (скорее всего, lightdm, поскольку вы используете Ubuntu).

Затем ознакомьтесь с настройками служб systemd и диспетчера дисплеев, настройте автоматический вход в диспетчер дисплеев и включите его службу.

Связанный контент