루트에서 루트가 아닌 사용자로 자동 로그인을 변경하는 방법은 무엇입니까?

루트에서 루트가 아닌 사용자로 자동 로그인을 변경하는 방법은 무엇입니까?

3.4.113-sun8i Openbox와 함께 Ubuntu 서버 16.04(실제로는 )를 설치했습니다 . 부팅 후 그래픽을 얻으려면 이 명령을 startx내부에 입력하세요. /etc/rc.local하지만 문제는 자동으로 루트 사용자로 로그인하고 이로 인해 내 C++ 프로그램이 올바르게 작동하지 않는다는 것입니다. (전에 요청한 대로 루트 사용자가 pulseaudio 또는 gtk와 같은 일부 라이브러리를 자동으로 시작할 수 없기 때문이라고 합니다.) . 그리고 수동으로 시작해야 하기 때문에 맞는 것 같아요.

그런데 자동 로그인을 루트에서 루트가 아닌 사용자로 변경하는 방법을 찾고 있습니다. 내가 어떻게 해?

편집: 내 목표는 가젯을 만드는 것입니다. 사용자는 물리적 버튼을 통해서만 가젯을 켜거나 끌 수 있습니다(메뉴, 옵션 등이 없음을 의미함). 가젯은 부팅 후 내 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에 로그인하려면 사용자 이름과 비밀번호를 수동으로 입력해야 합니다.

username 으로 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생성되지 않았지만 생성된 경우 "$XDG_VTNR" 값을 확인 /tmp/hole2해야 함을 의미합니다 .cat /tmp/hole2

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

결국 재부팅하면 이미지가 직접 표시됩니다. 위의 지침은 다음과 같이 요약될 수 있습니다.

다중 사용자.대상 -> tty1 -> 실행[이메일 보호됨]-> 원하는 사용자 이름으로 ExecStart 자동 로그인 -> 로그인하면 ~/.profile이 실행됩니다. -> exec startx-> startx가 실행됩니다 ~/.xinitrc. -> exec openbox-session이 실행됩니다. -> openbox가 실행됩니다 . ~/.config/openbox/autostart-> /home/m/img &팝업이 나타납니다.

[업데이트]

나는 OP와 채팅을 한다대화방(성적 증명서) 그의 문제를 해결했습니다.

rc.local은 rc.local이 startx를 루트로 실행하기 때문에 startx를 실행할 수 있지만 ~/.profile은 startx를 루트로 실행하지 않습니다. startx가 올바르게 실행되도록 하려면 startx > /tmp/my.log 2>&1/tmp/my.log에서 확인해야 한다는 메시지가 표시되고 결국 첫 번째 항목 이 이라는 것을 /home/m/.local/share/xorg/Xorg.0.log알게 됩니다 .(EE)(EE) open /dev/fb8: Permission denied

mOP는 startx가 원하는 FRAMEBUFFER /dev/fb8에 액세스할 때 권한을 얻기 위해 비디오 그룹에 사용자를 추가해야 합니다 .

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

심판 1,심판 2

p/s: 위의 오디오 그룹에 추가가 필요한지 궁금합니다.심판

답변2

/etc/rc.local사용자로 실행됩니다 root. 따라서 Xorg를 시작하려는 사용자가 이라고 가정하고 su -l jdoe -c startxin 을 사용해야 합니다 .rc.localjdoe

systemd가 없는지 의심스럽습니다. 왜냐하면 rc.localsystemd가 없는 이전 버전에서 업그레이드하지 않는 한 systemd는 기본적으로 무시하기 때문입니다. 심지어는 확실하지도 않습니다... 저는 systemd를 실행하지 않습니다.

systemd가 있는 경우 이를 위한 유닛 파일을 생성해야 합니다. 이에 대한 온라인 리소스가 많이 있습니다.

Google에서 "systemd 단위 파일"을 검색하여 다음을 찾았습니다. 파일에 다음을 넣으세요. /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

jdoe어느 정도 장치를 조정해야 합니다. 아마도 X를 다른 사용자로 시작하고 싶지 않을 것입니다 . 또한 users사용자가 속한 그룹이 아닐 수도 있고, 마지막으로 중요한 것은 경로를 찾기 위해 실행하는 /path/to/your/startx경로가 아닐 수도 있습니다 .startxwhich startx

다음으로 실행하여 sudo systemctl daemon-reload구성을 다시 로드하고 재부팅합니다.

편집(op의 의견에 따름):

당신은 이것을 원합니다 :

[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다음 어떤 디스플레이 관리자가 있는지 알아보세요(Ubuntu를 사용하고 있으므로 lightdm일 가능성이 높습니다).

그런 다음 시스템 서비스 및 디스플레이 관리자 구성을 읽고 디스플레이 관리자에서 자동 로그인을 구성하고 해당 서비스를 활성화하십시오.

관련 정보