su 사용자에 대해 '지정된 프로토콜 없음'을 해결하는 방법


15

시스템에서 그래픽 사용자를 위해 대체 사용자 (비 관리자)를 사용하려고합니다. 이 대체 사용자는 동일한 이름의 원격 시스템 사용자와 일치하도록 이름이 지정되고 UID 및 GID가 부여되었습니다. UID는 500이므로 사용자를 '비 로그인'사용자로 생각합니다.

우분투에서 메인 계정으로 로그인 한 후 터미널과 su대체 사용자를 열었습니다 . 그런 다음 명령을 실행하여 응용 프로그램을 시작하고 'No protocol specified'를받습니다.

UID <1000 때문 su입니까, 사용자의 비 관리자 때문입니까? 이 사용자가 GUI로 응용 프로그램을 실행하도록하려면 어떻게해야합니까?

답변:


15

사용자의 UID로 인해 문제가 발생 하지 않습니다 . 500은 UID처럼 괜찮으며 UID는 일부 디스플레이 관리자의 기본 설정을 제외하고는 로그인하지 않은 사용자로 만들지 않습니다.

지정된 프로토콜 없음 오류 메시지 는 응용 프로그램 별 오류 메시지처럼 들리며 도움이되지 않지만 오류가 발생하여 응용 프로그램이 X11 디스플레이에 접속할 수 없다는 권한이 있다고 생각합니다. 다른 사용자로 실행되기 때문입니다. X11 서버와 통신하려면 다른 사용자가 실행중인 시스템의 다른 프로세스가 디스플레이에 침입하거나 창을 만들거나 키 입력을 스누핑 할 수 없도록 응용 프로그램에 "매직 쿠키"(비밀 토큰)가 필요합니다. 데스크톱 시스템을 시작한 사용자 만 액세스 할 수 있도록 권한이 설정되어 있으므로 다른 시스템 사용자는이 매직 쿠키에 액세스 할 수 없습니다.

원래 사용자로 실행하여 X11 쿠키를 다른 계정으로 복사하십시오.

su - <otheruser> -c "unset XAUTHORITY; xauth add $(xauth list)"

그런 다음 응용 프로그램을 실행하십시오. XAUTHORITY해당 쉘에서도 설정을 해제해야 할 수도 있습니다. 이 명령 xauth list은 기본 사용자로부터 매직 쿠키 ( )를 추출하여 xauth add다른 사용자가 얻을 수있는 곳에 쿠키 ( )를 추가 합니다.


기괴하게 인용 된 명령을 사용하면 'su : 터미널에서 실행해야합니다.' 그러나 그것은 이다 ... 터미널에서
J 콜린스

@JCollins는 시도 xauth list >/tmp/xa.$$; su - <otheruser> -c "unset XAUTHORITY; xargs xauth add </tmp/xa.$$"; rm -f /tmp/xa.$$하지만 끔찍한 경쟁 조건이 있음을 알고 있습니다.
roaima

@JCollins 죄송 su합니다. 암호를 요청하려면 문제가 될 것 입니다. 이 새로운 명령을 시도하십시오.
Celada

@Celada, 금은 대접을 받았습니다. 그 명령이 무엇을 어떻게하는지 자세하게 설명해 주시겠습니까? 그리고 아마도 원래의 화신이 아닌 이유를 설명 할 수 있습니까?
J Collins

1
@JCollins 매번 새로운 매직 쿠키가 생성되므로 로그 아웃하고 로그인 한 후 매번 다시 실행해야합니다. 정상입니다. 보안 모델의 일부입니다.
Celada

6

제 경우에는 새로운 디스플레이 서버 wayland가 문제였습니다.

단지 할 xhost + local:다른 사용자 (예 : 루트)가 세션에 용 프로그램을 실행할 수 있습니다 다음, 네트워크 연결하지만 허용되지 않습니다.

모든 호스트의 클라이언트를 허용 하려면 xhost +호스트를 지정하지 않고 사용할 수 있습니다 . 그러나 이것은 안전하지 않으므로 세션에 대한 액세스 권한을 부여 할 호스트를 지정하는 것이 좋습니다.


1
제 경우에는 xhost +충분했습니다
danger89

1
@ danger89는 작동하지만 원격 액세스를 방지하는 방화벽 규칙이없는 경우 모든 호스트가 세션에 연결할 수 있습니다 (모든 배포에는 들어오는 모든 요청을 거부하는 방화벽 규칙이있는 것은 아닙니다. 새 리눅스 사용자의 경우 문제가 될 수 있습니다. 개인적으로 나는 액세스가 저장 측면에 있도록 제한하고
싶습니다

3

그런 식으로 해봐

$ export LOGIN_USER="Math"
$ su - $LOGIN_USER
$ sudo xhost local:$LOGIN_USER &>/dev/null

출처

추신 : 받아 들인 대답이 효과가 없었습니다.


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와 같은 것). 올바른 .Xauthority 파일이 표시되면 실제로 XAUTHORITY 환경 변수에 대해 걱정할 필요가 없습니다 (실제로 해당 파일의 비표준 위치를 조작하려는 경우를 제외하고는 실제로 그것이 언제인지 알 수 없습니다) ).

해당 파일을 제거하십시오 (존재하는 경우).

rm /root/.Xauthority

/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 서버에 다시 연결할 수 있습니다.


스레드가 없습니다, 이것은 포럼이 아닌 Q & A 사이트입니다
Anthon

1

upstart 스크립트에서 Selenium 3.3.1 인스턴스를 시작한 다음 Selenium에서 Chrome 드라이버를 사용할 때 "No protocol specified"라는 오류가 발생했습니다. Selenium은 X11과 동일한 사용자로 실행되었으며 DISPLAY 쉘 환경 변수가 올바르게 설정되었습니다. 흥미로운 점은 Firefox 드라이버를 사용할 때이 오류가 발생하지 않았다는 것입니다. upstart 스크립트 내에서 XAUTHORITY 쉘 환경 변수를 설정하여 활성 X11 사용자의 $ XAUTHORITY 값을 가리 키도록 설정하면 Chrome 드라이버의 오류가 수정되었습니다.

참고로 "프로토콜을 지정하지 않았습니다"라는 오류는 Chrome / Chrome 드라이버에 의해 완전히 묻혀있어 찾기가 쉽지 않았습니다. Chrome은의 패턴으로 디렉토리를 계속 /tmp/.org.chromium.Chromium.*만들었지 만 빠르게 사라지고 있음을 알았습니다 . chrome_debug.log메시지에 "디스플레이를 열 수 없습니다" 라는 파일 이 포함되어 있음 을 알았습니다. 나는 셀레늄 프로세스가 올바른 디스플레이를 가지고 있음을 확인하고 셀레늄 프로세스 /proc/$pid/environ의 출력을 strace더 철저히 조사한 결과 이것이 다소 이상하다고 생각했다.

이 오류는 XAUTHORITY를 설정 해제하고 일부 X11 클라이언트를 실행하여 재현 할 수 있습니다. 예를 들면 다음과 같습니다.

$ XAUTHORITY= xeyes
No protocol specified
Error: Can't open display: :0.0


0

입력 xhost +SI:localuser:root후 터미널에 이것을 입력 export DISPLAY=:0.0하고 다시 시도하십시오.


0

허용 된 답변에 단서를 사용하여 문제를 다르게 해결할 수있었습니다.

  1. 작동하는 계정에서 Xauth 파일을 찾습니다 (Xauth1).
  2. 계정에서 Xauth 파일을 찾습니다 (Xauth2).
  3. Xauth1을 Xauth2로 복사
  4. Xauth2의 권한 변경

코드에서 :

root@45c4933a8f1a:~# xauth info
Authority file:       /headless/.Xauthority
<snip>
root@45c4933a8f1a:~# su OtherUser
OtherUser@45c4933a8f1a:/headless$ xauth info
Authority file:       /home/OtherUser/.Xauthority
<snip>
OtherUser@45c4933a8f1a:/headless$ exit
exit
root@45c4933a8f1a:~# cp /headless/.Xauthority /home/OtherUser/.Xauthority 
root@45c4933a8f1a:~# chown OtherUser:OtherUser /home/OtherUser/.Xauthority
root@45c4933a8f1a:~# su OtherUser

0

user2 ( 일반 사용자 ) 로 GUI에 액세스하려고하면 설치 UI를 user2 로로드해야합니다 .

이것을 따르십시오 :

루트로그인 :

sudo su

x 서버를 테스트하십시오.

xclock

시계가 작동하는 것을 볼 수 있다면 좋습니다. 이제 다음을 실행하십시오.

xhost

결과는 다음과 같아야합니다.

xhost SI:localuser:tri
# tri is my user name

이제 user2가 xhost에 액세스 하도록하십시오

xhost +SI:localuser:user2

이제 user2에 다시 로그인 하여 GUI 프로그램을 열어보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.