원격 X 디스플레이에서 창을 엽니 다 (“디스플레이를 열 수없는 이유”)?


81

옛날 옛적에,

DISPLAY=:0.0 totem /path/to/movie.avi

노트북에서 데스크탑으로 ssh를 연결하면 데스크탑에서 토템이 재생 movie.avi됩니다.

이제 오류가 발생합니다.

No protocol specified
Cannot open display:

두 컴퓨터에서 데비안 스퀴즈가 안정적으로 다시 설치되면 구성을 위반 한 것 같습니다.

나는 이것에 대해 봤는데, 내 인생에서 내가해야 할 일을 알아낼 수 없다.

(VLC에는 작동하는 HTTP 인터페이스가 있지만 ssh만큼 편리하지는 않습니다.)

cron 작업에서이를 실행하려고 할 때도 동일한 문제가 발생합니다.


1
원격 시스템에 .Xauthority 파일이 표시됩니까? 또 다른 명백한 질문은-ssh 서버와 클라이언트가 X 전달을 허용하도록 구성되어 있습니까? ssh에 어떤 명령을 사용하셨습니까?
Faheem Mitha

1
X를 전달하려고합니까? 클라이언트가 아닌 호스트에서 명령을 실행하고 싶습니다. 내 ssh 명령은 ssh me @ host입니다. 호스트 컴퓨터의 .Xauthority가 파일과 일치하지 않습니다.
저스틴 유채과 야채

Faheem이 제안한 바와 같이, totemX 쿠키를 찾지 못해 발생하는 문제에 대한 좋은 변화가 XAUTHORITY있으며, 적절한 값 (예 : 데스크탑의 일반 세션 값) 으로 설정해야합니다 . Linux 읽기 : 일부 배경에서 ssh + screen통해 세션이 시작되면 wmctrl이 표시를 열 수 없습니다 . 또한 관련 답변을 참조하십시오. root로 다른 사용자 데스크탑에서 그래픽 프로그램을 시작할 수 있습니까? .
Gilles

1
괜찮아, 물리적으로 컴퓨터에 앉아 에코 $의 XAUTHORITY를 입력이 = (경로 위) 문제가 해결되지 않는 에코 $ 표시를 입력,은 / var / 실행이 / gdm3 / 인증-를위한 jcress-bb32gX가 SSH 세션에서 / 데이터베이스를 제공합니다
저스틴 유채과 야채

1
나는 그들이 단지 지켰다 수없는 이유를 GDM3, 비난 $XAUTHORITY~/.Xauthority모든 사람들이 그것이 될 것으로 예상처럼합니다.
Arrowmaster

답변:


78

( Linux 에서 적응 : ssh + screen을 통해 세션이 시작되면 wmctrl이 디스플레이를 열 수 없음 )

디스플레이 및 권한

X 프로그램은 X 디스플레이에 연결하기 위해 두 가지 정보가 필요합니다.

  • 그것은 일반적으로 디스플레이의 주소가 필요 :0당신은 로컬 또는 로그인 할 때를 :10, :11등 당신은 원격으로 로그인 한 (그러나 숫자가 활성화 얼마나 많은 X 연결에 따라 변경 될 수 있습니다) 때. 디스플레이의 주소는 일반적으로 DISPLAY환경 변수에 표시됩니다 .

  • 디스플레이 암호가 필요합니다. X 디스플레이 암호를 매직 쿠키 라고 합니다 . 매직 쿠키는 직접 지정되지 않습니다. 쿠키는 항상 X 표시 파일에 저장됩니다.이 파일은“display :42has cookie 123456” 형식의 레코드 모음입니다 . X 권한 파일은 일반적으로 XAUTHORITY환경 변수에 표시됩니다 . 설정 $XAUTHORITY되어 있지 않으면 프로그램은을 사용 ~/.Xauthority합니다.

데스크탑에 표시된 창에서 작동하려고합니다. 데스크톱 컴퓨터를 사용하는 유일한 사람인 경우 표시 이름은 :0입니다. X 권한 파일의 위치를 ​​찾는 것은 더 어렵습니다. 데비안 스퀴즈 또는 우분투 10.04에서 gdm을 설정하면 임의로 생성 된 이름을 가진 파일에 있기 때문입니다. 이전 버전의 gdm에서 기본 설정 (예 :에 저장된 쿠키)을 사용했기 때문에 문제가 없었습니다 ~/.Xauthority.

변수 값 얻기

DISPLAY및 의 값을 얻는 몇 가지 방법은 다음 과 XAUTHORITY같습니다.

  • 당신은 체계적에서 로그인 스크립트 (아마도 자동으로 바탕 화면에서 화면 세션을 시작할 수 ~/.profile있지만 그것은 단지 X에서 로그인하는 경우 수행 테스트를하는 경우 DISPLAY로 시작하는 값으로 설정 :(즉, 모든 경우 당신은 가능성이있어이 포함되어야 발생)). 에서 ~/.profile:

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    그런 다음 ssh 세션에서

    screen -d -r local
    
  • 또한의 값을 절약 할 수 DISPLAYXAUTHORITY파일에하고 값을 기억합니다. 에서 ~/.profile:

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    ssh 세션에서 :

    . ~/.local-display-setup.sh
    screen
    
  • 당신의 값을 감지 할 수 DISPLAYXAUTHORITY실행중인 프로세스에서입니다. 자동화하기가 더 어렵습니다. 작업하려는 디스플레이에 연결된 프로세스의 PID를 파악한 다음 /proc/$pid/environ( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')¹) 에서 환경 변수를 가져와야합니다.

쿠키 복사

Arrowmaster 의 제안에 따른 또 다른 접근법 $XAUTHORITY은 ssh 세션에서 값을 얻으려고 시도하지 않고 대신 X 세션에서 쿠키를에 복사하는 것 ~/.Xauthority입니다. 쿠키는 로그인 할 때마다 생성되므로에서 값을 오래 유지해도 문제가되지 않습니다 ~/.Xauthority.

원격 관리자가 해당 내용을 볼 수 있도록 NFS 또는 다른 네트워크 파일 시스템을 통해 홈 디렉토리에 액세스 할 수있는 경우 보안 문제가있을 수 있습니다. X TCP 연결을 활성화하지 않은 경우 (어쨌든 데비안은 기본적으로 꺼져 있습니다) 여전히 컴퓨터에 연결해야합니다. 따라서 대부분의 사람들에게 이것은 적용되지 않거나 (NFS 없음) 문제가 아닙니다 (X TCP 연결 없음).

데스크탑 X 세션에 로그인 할 때 쿠키를 복사하려면 ~/.xprofile또는 다음 라인을 추가하십시오 ~/.profile(또는 로그인 할 때 읽히는 다른 스크립트).

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

¹ 이 인용 적절한하지만,이 특정 인스턴스에 부족 원칙 $DISPLAY$XAUTHORITY어떤 쉘 메타 문자가 포함되지 않습니다.


2
이를 자동화하는 한 가지 방법 ~/.xprofile은 X 로그인 중에 만 실행해야하는 ~/.Xauthority정보를 작성 하고 올바른 정보로 작성 / 업데이트 하도록하는 것입니다. 심볼릭 링크로 충분할까요?
Arrowmaster

@Arrowmaster : 좋은 제안입니다. 나는 그것을 생각하지 않았다. 예를 들어 vnc를 사용하여 다른 터미널에서 두 개 이상의 X 세션에 로그인하는 경우와 같이 모든 경우에 작동하지는 않지만 간단하고 일반적인 용도로는 충분합니다. 심볼릭 링크가 가장 좋습니다. 흠, 실제로 더 좋고 간단한 방법이 있습니다 . 정보를에 복사 할 수 있습니다 ~/.Xauthority.
Gilles

1
같은 것을 넣어겠습니까 xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -에서 ~/.xprofile여러 $ DISPLAY의의 사건을 해결?
Arrowmaster

@Arrowmaster : 여러 디스플레이에 어떤 문제가 있습니까? 관심있는 디스플레이에 대한 정보 만 추출하기 때문에 원칙적으로 코드가 약간 깨끗할 수 있지만, 어커의 경우 간단한 병합이나 실제로는 매우 특이한 상황에서는 잘못된 것이 없습니다.
Gilles

1
디스플레이에 연결된 기존 프로세스에서 환경을 읽는 것은 유감스럽게도 악의적입니다. 전심으로 승낙합니다. 이를 위해서는 Unix.SE에 Evil Genius ™ 배지가 필요합니다.
derobert

19

추가 하여이 문제를 해결했습니다.

xhost +si:localuser:$USER

~/.xprofile. 이것이 완전히 안전한지 모르겠습니다 (더 많은 지식이있는 사람들이 생각하는 것을 듣고 싶습니다.)하지만 xhost +일반적으로 제안 할 때 액세스 제어를 끄는 것보다 ( )을 사용하는 것보다 훨씬 낫다고 추측 합니다 이 문제에 대한 Google.


1
localuser서버 해석 주소는 완전히 안전합니다. 데비안은 기본적으로 로그인 과정 ( /etc/X11/Xsession.d/35x11-common_xhost-local)의 일부로이를 수행합니다 . 자세한 내용은 Xsecurity 매뉴얼 페이지 를 참조하십시오.
Sam Morris

당신이 LAN에 있다면, xhost +아마도 대부분의 경우에 충분할 것입니다 ...
Alexis Wilke

이 명령의 의미를 설명 할 수 있습니까?
alpha_989

@ alpha_989 : "나로 실행중인 로컬 실행 [localuser] 응용 프로그램에 [$ USER] 액세스 권한을 부여합니다." 은 "시는"단지 접착제 (참조입니다 xhost(1)Xsecurity(7)문서에 대한). 이 명령 자체만으로는 어떤 종류의 원격 액세스 나 X11 포워딩도 허용 하지 않습니다 ( "매직 쿠키"메커니즘이 일반적으로 선호 됨 xhost).
케빈

7

당신은 필요 export DISPLAY=:0.0


변수가 같은 줄에 쓰여질 때 Unix는 내보내기를 요구하지 않습니다. 이 변수는 줄이 끝날 때까지 유효합니다.
Alexis Wilke

사실, 당신 말이 맞아요.
asoundmove

이 답변은 명백히 잘못되었으므로 삭제해야합니다.
Piotr Dobrogost

DISPLAY = : 0.0 만 입력하면 변수 이름이 설정됩니다. 감사합니다 @asoundmove. 그러나 : 0.0은 서버 디스플레이에서 DISPLAY 변수의 값이라고 생각합니다. Putty에서 로그인하는 경우 변수 DISPLAY는 10 이상이어야합니다. 10 : 그래서 DISPLAY =되어야
alpha_989

3

데비안 wheezy-> 우분투 트러스트 나를 위해 작동합니다.

참고 :이 경우 서버에서 디스플레이 관리자를 실행하지 않는 경우 그래픽 카드 나 모니터가 연결되지 않은 '헤드리스'가상 머신입니다.

bob@laptop:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
bob@laptop:~$ ssh -C -R 6000:127.0.0.1:6000 alice@server
X11 forwarding request failed on channel 0
alice@server:~$ export DISPLAY=:0.0
alice@server:~$ xterm

랩탑의 X 디스플레이는 서버에서 실행중인 xterm의 출력을 보여줍니다.

다음을 사용하여 디버그하십시오.

bob@laptop:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
bob@laptop:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
alice@server:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
alice@server:~$ strace xterm

strace 수행중인 작업에 대한 많은 세부 사항을 쏟을 것입니다. 연결이 걸리는 곳 또는 기타를 기다리는 위치를 추측 할 수 있어야합니다.

한 줄에 ..

ssh -C -R 6000:127.0.0.1:6000 alice@server "DISPLAY=:0.0 xterm"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.