내 시스템에서 그래픽 소프트웨어를 실행하기 위해 대체 사용자(관리자가 아닌)를 사용하려고 합니다. 대체 사용자는 동일한 이름의 원격 시스템 사용자와 일치하도록 이름이 지정되고 UID 및 GID가 제공됩니다. UID는 500이므로 이 사용자는 "로그인되지 않은" 사용자가 됩니다.
Ubuntu에서 시작하여 기본 계정으로 로그인한 후 터미널을 열고 su
대체 사용자로 전환했습니다. 그런 다음 응용 프로그램을 시작하는 명령을 실행하려고 시도했지만 "지정된 프로토콜 없음"이라는 메시지를 받았습니다.
UID가 < 1000이기 때문입니까, su
아니면 사용자가 관리자가 아니기 때문입니까? 이 사용자가 GUI를 사용하여 애플리케이션을 실행하도록 하려면 어떻게 해야 합니까?
답변1
제 경우에는 새로운 디스플레이 서버 프로토콜이 wayland
문제였습니다.
이렇게 하면 xhost + local:
다른 사용자(예: 루트)가 귀하의 세션에서 프로그램을 실행할 수 있지만 네트워크 연결은 허용되지 않습니다.
고객을 허용하려는 경우모든 호스트xhost +
, 호스트를 지정하지 않고 사용할 수 있습니다.그러나 이것은 안전하지 않습니다, 세션 액세스 권한을 부여하려는 호스트만 지정하는 것이 가장 좋습니다.
답변2
문제는아니요사용자의 UID로 인해 발생합니다. 500을 UID로 사용하는 것은 괜찮으며 해당 UID는 일부 디스플레이 관리자의 기본 설정을 제외하고는 "로그인하지 않은" 사용자로 만들지 않습니다.
에러 메시지프로토콜이 지정되지 않았습니다.응용 프로그램 관련 오류 메시지처럼 들리며 도움이 되지 않습니다. 그러나 제 생각에는 응용 프로그램이 다른 사용자로 실행 중이므로 해당 응용 프로그램이 X11 디스플레이에 연결할 수 없기 때문에 오류가 발생하는 것 같습니다. 다른 사용자가 실행 중인 시스템의 다른 프로세스가 디스플레이를 해킹하고, 창을 생성하고, 키 입력을 스누핑할 수 없도록 응용 프로그램은 X11 서버와 통신하기 위해 "마법 쿠키"(비밀 토큰)가 필요합니다. 데스크톱 환경을 시작한 사용자만 액세스할 수 있도록 권한이 설정되어 있기 때문에 다른 시스템 사용자는 이 매직 쿠키에 액세스할 수 없습니다.
X11 쿠키를 다른 계정에 복사하려면 원래 사용자로 실행해 보세요.
su - <otheruser> -c "unset XAUTHORITY; xauth add $(xauth list)"
그런 다음 애플리케이션을 실행하십시오. XAUTHORITY
셸에서 설정을 해제 해야 할 수도 있습니다 . 이 명령은 기본 사용자로부터 매직 쿠키( )를 추출하여 다른 사용자가 얻을 수 있는 위치에 xauth list
추가( )합니다.xauth add
답변3
당신이 X와 접촉하도록 무차별 대입을 하고 싶다고 가정해 봅시다...
(X가 실행 중인) 서버에서 이미 명령을 실행하고 있다고 가정하고, 그렇지 않으면 먼저 작동하게 한 다음 클라이언트에서 "ssh -X user@server"를 사용합니다.
xauth 명령을 실행하는 방법은 여러 가지가 있을 수 있습니다. 예를 들어 "sudo"를 사용할 수 있지만 환경 변수가 손실되거나 변경될 수 있습니다. DISPLAY 및 XAUTHORITY 환경 변수를 보존해야 합니다. 이러한 경우인지 테스트하려면 명령을 실행하는 것과 동일한 방식으로 "echo $XAUTHORITY"를 실행할 수 있습니다. 단, 이러한 명령을 실행하기 전에 환경 변수를 확장하지 않도록 하십시오. 예를 들어, sudo bash -c 'echo "$XAUTHORITY"'를 실행하여 sudo를 실행한 후 XAUTHORITY가 정확히 무엇인지 확인합니다(사라지면 sudoers 파일에 무언가를 추가해야 할 수도 있습니다. 다른 곳 참조).
마지막으로 액세스하려는 사용자로 서버에서 다음 명령을 실행하십시오.
xauth info
그러면 사용될 "권한 파일"이 표시됩니다(기본적으로 /root/.Xauthority, 루트의 경우 또는 /home/theuser/.Xauthority와 같은 파일). 올바른 .
파일이 있으면 삭제하십시오.
mv /root/.Xauthority /root/.Xauthority.bak
물론 위 명령에서 /root/.Xauthority
상황에 맞는 올바른 XAUTHORITY 파일을 대체하세요.
다시 생성하되 비어 있습니다(많은 명령에 필요함).
touch /root/.Xauthority
이 시점에서 당신은 얻을 것입니다프로토콜이 지정되지 않았습니다.오류가 발생하더라도잘못된 MIT-MAGIC-COOKIE-1앞으로. 현재 X 서버에서 사용 중인 권한 파일을 찾으십시오.
ps aux | grep Xorg
다음과 같이 표시되어야 합니다.
root 1153 0.0 1.0 149560 44464 tty7 Ss+ dec02 0:00 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711} -background none -noreset -displayfd 17 vt7
뒤에 오는 파일 이름은 -auth
다음 명령에 필요한 파일 이름입니다. 루트로 실행:
sudo xauth -f '/var/run/sddm/{ef18c483-7891-4e82-80ef-2c8f9bd79711}' list
32자리 16진수 키가 나열됩니다. 예를 들어 출력은 다음과 같습니다.
hostname/unix:0 MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7
이를 사용하여 .Xauthority 파일을 생성합니다(다시 로그인해야 하는 사용자로):
xauth add $DISPLAY MIT-MAGIC-COOKIE-1 c0eaf749aa252101a0f57d5087089db7
'c0eaf749aa252101a0f57d5087089db7'을 list 명령에서 반환된 내용으로 바꾸세요. 이제 .Xauthority 크기는 51바이트가 되어야 하며 X 서버에 (다시) 연결할 수 있습니다.
PS /usr/bin/startx
저처럼 Xorg를 실행하여 시작했다면 다음과 같은 내용이 나타날 것입니다.
root 1652 0.0 0.0 12788 5792 ? Ss jan20 0:00 login -- carlo
carlo 1834 0.0 0.0 8140 3468 tty1 Ss jan20 0:00 \_ -bash
carlo 1887 0.0 0.0 7404 3236 tty1 S+ jan20 0:00 \_ /bin/sh /usr/bin/startx
carlo 1905 0.0 0.0 3912 828 tty1 S+ jan20 0:00 \_ xinit /home/carlo/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.WWPpq4OSlA
root 1906 1.2 0.7 25576848 235104 tty1 Sl jan20 207:56 \_ /usr/lib/Xorg -nolisten tcp :0 vt1 -keeptty -auth /tmp/serverauth.WWPpq4OSlA
carlo 1917 0.0 0.0 143408 10884 tty1 Sl jan20 0:00 \_ startplasma-x11
삭제 되었습니다 /tmp/serverauth.WWPpq4OSlA
. /usr/bin/startx
작동 방식을 보려면 스크립트를 참조하세요 .
mcookie=`/usr/bin/mcookie`
xserverauthfile=`mktemp -p /tmp serverauth.XXXXXXXXXX`
trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM
xauth -q -f "$xserverauthfile" << EOF
add :$dummy . $mcookie
EOF
또한
xauth -q << EOF
add $displayname . $mcookie
EOF
사용자 .Xauthority
파일에 임의의 쿠키를 추가합니다.
이 경우 쿠키는 완전히 사라집니다. 내가 그것을 되돌릴 수 있는 유일한 장소는 Xorg 프로세스의 메모리(RAM)이지만 그것을 복원하는 방법을 알아내기에는 너무 게으르다. 물론 X를 다시 시작하면 .Xauthority
새 쿠키로 파일이 다시 생성되고 동일한 쿠키로 서버가 다시 시작됩니다.
답변4
터미널에 이것을 입력 xhost +SI:localuser:root
하고 export DISPLAY=:0.0
다시 시도하세요