¿Cómo cambiar el inicio de sesión automático de usuario root a usuario no root?

¿Cómo cambiar el inicio de sesión automático de usuario root a usuario no root?

He instalado el servidor Ubuntu 16.04 (en realidad lo es 3.4.113-sun8i ) con Openbox. y coloque este comando startxdentro /etc/rc.localpara tener gráficos después del arranque. pero el problema es que inicia sesión automáticamente como usuario root y, debido a esto, mi programa C++ no funciona correctamente (como pregunté antes, dicen que es porque el usuario root no puede iniciar algunas bibliotecas como pulseaudio o gtk automáticamente) . Y creo que es correcto porque debería iniciarlos manualmente.

Por cierto, estoy buscando una forma de cambiar el inicio de sesión automático de usuario root a usuario no root. ¿Cómo puedo hacerlo?

EDITAR: mi objetivo es crear un dispositivo, los usuarios solo pueden activarlo/desactivarlo mediante un botón físico (me refiero a ningún menú, opción, etc.). El dispositivo debe ejecutar mi código C++ después del arranque, y el código utiliza las bibliotecas gtk y pulseaudio.

Respuesta1

Me lo dijiste enOtro comentarioque tu sistema muestre esto:

$ systemctl get-default
graphical.target

Entonces, cámbialo a multi-user.target:

$ sudo systemctl set-default multi-user.target

Y multi-user.target comenzará en tty1 (Ctrl+Alt+F1):

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

Entonces, anulamos el archivo tty1:

$ sudo systemctl edit getty@tty1

Con este contenido (que mes tu nombre de usuario):

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

/sbin/agettyLo anterior puede ser diferente en su sistema, asegúrese de verificar la ruta correcta con:

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

Presione Esc, luego shift+ z+ zpara guardar y salir (esta clave es para vim, puede ejecutarla ps aen otra pestaña de terminal mientras edita para saber que su comando es , en el cual hay un enlace simbólico en mi sistema, su sistema puede variar).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

Luego, seleccione getty@tty1y navegue hasta el final, sabrá que simplemente agregue estas líneas para lograr el efecto de anulación:

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

El inicio de sesión automático se realizó --autologinanteriormente; de ​​lo contrario, deberá escribir manualmente el nombre de usuario y la contraseña para iniciar sesión en tty1 después del inicio.

Después de iniciar sesión en tty1 con nombre de usuario m, se ejecutará /home/m/.profile, así que agregue esta línea al final de su /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/holeNLo anterior es solo para fines de depuración, para saber que se ejecuta como se desea. Por ejemplo, si /tmp/hole3no se creó pero /tmp/hole2se creó, significa que debe cat /tmp/hole2verificar el valor de "$XDG_VTNR".

startxLuego se ejecutará /home/m/.xinitrc, edítelo:

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

openbox-sessionLuego se ejecutará /home/m/.config/openbox/autostart, edítelo como de costumbre:

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

Después de todo, reinicie y le llevará a mostrar su imagen directamente. Las instrucciones anteriores se pueden resumir como:

multi-user.target -> tty1 -> ejecutar[correo electrónico protegido]-> Inicio de sesión automático de ExecStart con el nombre de usuario deseado -> iniciar sesión se ejecutará ~/.profile -> exec startx-> startx se ejecutará ~/.xinitrc-> exec openbox-session -> openbox se ejecutará ~/.config/openbox/autostart-> /home/m/img &aparecerá una ventana emergente.

[ACTUALIZAR]

Hablo con OP ensala de chat(transcripción) y resolvió su problema.

rc.local puede iniciar x debido a que rc.local ejecuta startx como root, pero ~/.profile no se ejecuta startx como root. Lo hacemos startx > /tmp/my.log 2>&1para garantizar que startx se ejecute correctamente, luego /tmp/my.log mostrará que debemos verificar /home/m/.local/share/xorg/Xorg.0.logy, finalmente, noté que el primero (EE)es (EE) open /dev/fb8: Permission denied.

OP necesita agregar un usuario mal grupo de videos para obtener permiso cuando inicie x para acceder al FRAMEBUFFER /dev/fb8 deseado.

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

ref1,ref2

p/s: Me pregunto si es necesario agregar al grupo de audio anterior.árbitro

Respuesta2

/etc/rc.localse ejecuta como usuario root. Por lo tanto, debería utilizar su -l jdoe -c startxin rc.local, asumiendo que jdoees el usuario con el que desea iniciar Xorg.

Dudo que tengas systemd, porque systemd, por defecto, ignora rc.locala menos que hayas actualizado desde una versión anterior que no tenía systemd y aun así, no estoy seguro... No ejecuto systemd.

Si tiene systemd, necesita crear un archivo de unidad para esto. Hay muchos recursos en línea para esto.

Busqué en Google "archivo de unidad systemd" y encontré lo siguiente: Coloque lo siguiente en el archivo: /etc/systemd/system/autologin.service(suponiendo que ahí es donde reside systemd en su sistema)

[Unit]
Description=Autologin service

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

[Install]
WantedBy=multi-user.target

Tendrás que adaptar un poco la unidad....probablemente no quieras iniciar X como jdoesino como otro usuario. Además, userses posible que no sea un grupo del que el usuario sea miembro; por último, pero no menos importante, /path/to/your/startxno es la ruta a su startx... ejecute which startxpara encontrar la ruta.

A continuación, ejecuta sudo systemctl daemon-reloadpara recargar la configuración y reinicia.

EDITAR (siguiendo los comentarios de op):

Tu quieres esto:

[Unit]
Description=Autologin service

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

[Install]
WantedBy=multi-user.target

Suponiendo que startxesté en /usr/bin/startx, eso "debería" funcionar.

Respuesta3

Comience eliminando startxde /etc/rc.local, luego averigüe qué administrador de pantalla tiene (probablemente lightdm, ya que está en Ubuntu).

Luego lea sobre los servicios systemd y la configuración del administrador de pantalla, configure el inicio de sesión automático en el administrador de pantalla y habilite su servicio.

información relacionada