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

1

Eu instalei o servidor Ubuntu 16.04 (na verdade é 3.4.113-sun8i ) com o Openbox. e coloque este comando startx inside /etc/rc.local para ter gráficos após o boot. mas o problema é que ele loga automaticamente como usuário root, e por causa disso, meu programa C ++ não funciona corretamente (como eu perguntei antes, eles dizem que é porque o usuário root não pode iniciar algumas bibliotecas como pulseaudio ou gtk automaticamente) . E acho que é certo porque eu deveria começar manualmente.

A propósito, estou procurando uma maneira que mude o autologin do usuário root para o não-root. como posso fazer isso?

EDIT: my goal is building a gadget, users only can turn on/off it by physical button(I mean no menu,option,etc). The gadget must execute my C++ code after boot, and code uses gtk and pulseaudio libraries.

    
por user145959 19.11.2017 / 17:31

3 respostas

1

Você me disse em outro comentário que o seu sistema mostra isto:

$ systemctl get-default
graphical.target

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

$ sudo systemctl set-default multi-user.target

E o 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, sobrescrevemos o arquivo tty1:

$ sudo systemctl edit getty@tty1

Com esse conteúdo (qual m é seu nome de usuário):

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

/sbin/agetty acima pode ser diferente em seu sistema. Verifique se você está no caminho correto com:

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

Pressione Esc , então desloque + z + z para salvar e sair (esta tecla é para vim , você pode executar ps a na outra guia do terminal enquanto edita para saber que seu comando é editor /etc/systemd/system/[email protected]/.#override.blahblah , no qual editor é um link simbólico para vim.gtk3 em meu sistema, seu sistema pode variar).

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

Em seguida, goteie o getty@tty1 e navegue até o fundo, você saberá que basta anexar as 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 por --autologin acima, 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 logado em tty1 com o nome de usuário m , ele executará /home/m/.profile, então adicione esta linha ao final de 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/holeN acima é apenas para fins de depuração, para saber como é executado conforme desejado. por exemplo. Se /tmp/hole3 não foi criado, mas /tmp/hole2 foi criado, isso significa que você precisa de cat /tmp/hole2 para verificar o valor de "$ XDG_VTNR".

startx 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-session executará /home/m/.config/openbox/autostart , edite como de costume:

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

Afinal de contas, reboot, irá levá-lo para mostrar sua imagem diretamente, as instruções acima podem ser resumidas como:

multi-user.target -> tty1 -> run [email protected] -> ExecStart auto login with desired username -> logged-in will execute ~/.profile -> exec startx -> startx will execute ~/.xinitrc -> exec openbox-session -> openbox will execute ~/.config/openbox/autostart -> /home/m/img & will pop up.

[UPDATE]

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

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

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

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

ref1 , ref2

p / s: Gostaria de adicionar ao grupo de áudio acima é necessário. ref

    
por 23.11.2017 / 13:05
2

/etc/rc.local é executado como usuário root . Portanto, você deve usar su -l jdoe -c startx em rc.local , assumindo que jdoe é o usuário que você deseja iniciar o Xorg.

Eu duvido que você tenha systemd, porque systemd, por padrão, ignora rc.local a menos que você tenha feito upgrade de uma versão anterior que não tenha systemd e mesmo assim, não tenho certeza ... Eu não corro systemd.

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

Eu procurei no google por "arquivo de unidade systemd" e encontrei o seguinte: Coloque o seguinte no arquivo: /etc/systemd/system/autologin.service (supondo que é onde o systemd mora em 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 a unidade, um pouco ... você provavelmente não deseja iniciar o X como jdoe , mas como outro usuário. Além disso, users pode não ser um grupo do qual o usuário é membro, por último mas não menos importante, /path/to/your/startx não é o caminho para o startx ... run which startx para descobrir o caminho.

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

EDIT (seguindo comentários de op):

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

Assumindo que seu startx esteja em /usr/bin/startx , esse "deve" funcionar.

    
por 19.11.2017 / 20:34
0

Comece removendo startx de /etc/rc.local e, em seguida, descubra qual gerenciador de exibição você tem (provavelmente lightdm, já que você está no Ubuntu).

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

    
por 19.11.2017 / 18:04