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

옛날 옛적에,

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

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

이제 오류가 발생합니다.

No protocol specified
Cannot open display:

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

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

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

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



답변

( 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어떤 쉘 메타 문자가 포함되지 않습니다.


답변

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

xhost +si:localuser:$USER

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


답변

당신은 필요 export DISPLAY=:0.0


답변

데비안 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"


답변