Como alterar o login automático de usuário root para usuário não root?

Como alterar o login automático de usuário root para usuário não root?

Instalei o servidor Ubuntu 16.04 (na verdade é 3.4.113-sun8i ) com Openbox. e coloque este comando startxdentro /etc/rc.localpara ter gráficos após a inicialização. mas o problema é que ele faz login automaticamente como usuário root e, por causa disso, meu programa C++ não funciona corretamente (como perguntei antes, dizem que é porque o usuário root não consegue iniciar algumas bibliotecas como pulseaudio ou gtk automaticamente) . E acho certo porque devo iniciá-los manualmente.

A propósito, estou procurando uma maneira de alterar o login automático de usuário root para usuário não root. como eu posso fazer isso?

EDIT: meu objetivo é construir um gadget, os usuários só podem ligá-lo/desligá-lo por meio de um botão físico (quero dizer, sem menu, opção, etc.). O gadget deve executar meu código C++ após a inicialização, e o código usa as bibliotecas gtk e pulseaudio.

Responder1

Você me contou emoutro comentárioque seu sistema mostre isso:

$ systemctl get-default
graphical.target

Então, mude para multi-user.target:

$ sudo systemctl set-default multi-user.target

E multi-user.target começará em tty1 (Ctrl+Alt+F1):

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

Então, substituímos o arquivo tty1:

$ sudo systemctl edit getty@tty1

Com este conteúdo (que mé o seu nome de usuário):

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

/sbin/agettyacima pode ser diferente em seu sistema, certifique-se de verificar o caminho correto com:

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

Pressione Esc, então shift+ z+ zpara salvar e sair (estas teclas são para o vim, você pode executar ps aem outra aba do terminal enquanto edita para saber que seu comando é , no qual está o link simbólico no meu sistema, seu sistema pode 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

Em seguida, cat getty@tty1e navegue até o final, você saberá que basta anexar estas linhas para fazer o efeito de substituição:

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

Login automático feito --autologinacima, caso contrário você precisará digitar manualmente o nome de usuário e a senha para fazer login em tty1 após a inicialização.

Depois de fazer login em tty1 com nome de usuário m, ele executará /home/m/.profile, então adicione esta linha no final do seu /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/holeNacima é apenas para fins de depuração, para saber se ele funciona conforme desejado. por exemplo, se /tmp/hole3não foi criado, mas /tmp/hole2foi criado, isso significa que você precisa cat /tmp/hole2verificar o valor de "$XDG_VTNR" .

startxirá então executar /home/m/.xinitrc, edite-o:

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

openbox-sessionirá então executar /home/m/.config/openbox/autostart, edite-o como de costume:

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

Afinal, reiniciar, irá levá-lo para mostrar sua imagem diretamente, a instrução acima pode ser resumida como:

multiusuário.target -> tty1 -> executar[e-mail protegido]-> Login automático do ExecStart com o nome de usuário desejado -> o login será executado ~/.profile -> exec startx-> startx será executado ~/.xinitrc-> exec openbox-session -> openbox será executado ~/.config/openbox/autostart-> /home/m/img &irá aparecer.

[ATUALIZAR]

Eu converso com OP emsala de bate-papo(transcrição) e resolveu seu problema.

rc.local capaz de iniciarx por causa de rc.local executar startx como root, mas ~/.profile não é executado startx como root. Fazemos isso startx > /tmp/my.log 2>&1para garantir que o startx seja executado corretamente, então /tmp/my.log mostrará que precisamos verificar /home/m/.local/share/xorg/Xorg.0.loge, eventualmente, notei que o primeiro (EE)é (EE) open /dev/fb8: Permission denied.

O OP precisa adicionar o usuário mao grupo de vídeo para obter permissão quando startx acessar o FRAMEBUFFER /dev/fb8 desejado.

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

referência1,ref2

p/s: Gostaria de saber se é necessário adicionar ao grupo de áudio acima.referência

Responder2

/etc/rc.localé executado como usuário root. Você deve, portanto, usar su -l jdoe -c startxin rc.local, assumindo jdoeque é o usuário que deseja iniciar o Xorg.

Duvido que você tenha o systemd, porque o systemd, por padrão, ignora, rc.locala menos que você tenha atualizado de uma versão anterior que não tinha o systemd e, mesmo assim, não tenho certeza... Eu não executo o systemd.

Se você possui o systemd, precisará criar um arquivo de unidade para isso. Existem muitos recursos online para isso.

Pesquisei no Google por "arquivo de unidade systemd" e encontrei o seguinte: Coloque o seguinte no arquivo: /etc/systemd/system/autologin.service(assumindo que é onde o systemd reside no seu sistema)

[Unit]
Description=Autologin service

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

[Install]
WantedBy=multi-user.target

Você terá que adaptar um pouco a unidade.... você provavelmente não deseja iniciar o X como jdoeoutro usuário. Além disso, userspode não ser um grupo do qual o usuário é membro, por último, mas não menos importante, /path/to/your/startxnão é o caminho para o seu startx... execute which startxpara descobrir o caminho.

Em seguida, você executa sudo systemctl daemon-reloadpara recarregar a configuração e reinicializar.

EDIT (após comentários da operação):

Você quer isso:

[Unit]
Description=Autologin service

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

[Install]
WantedBy=multi-user.target

Supondo que você startxesteja em /usr/bin/startx, isso "deveria" funcionar.

Responder3

Comece removendo startxfrom /etc/rc.locale descubra qual gerenciador de exibição você possui (provavelmente lightdm, já que você está no Ubuntu).

Em seguida, leia sobre os serviços do systemd e a configuração do gerenciador de exibição, configure o login automático no gerenciador de exibição e habilite seu serviço.

informação relacionada