원격 X 모니터에서 창 열기("모니터를 열 수 없습니다" 이유)?

원격 X 모니터에서 창 열기("모니터를 열 수 없습니다" 이유)?

옛날 옛적에,

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

토템은 내 노트북에서 SSH로 연결한 후 movie.avi내 데스크탑에서 재생됩니다 .

이제 오류가 발생합니다.

No protocol specified
Cannot open display:

데비안 스퀴즈가 두 컴퓨터 모두에서 안정적인 후에 다시 설치했는데 구성이 깨졌던 것 같습니다.

나는 이것을 구글링했지만 평생 동안 내가 무엇을 해야 할지 알 수 없습니다.

(VLC에는 사용할 수 있는 HTTP 인터페이스가 있지만 SSH만큼 편리하지는 않습니다.)

cron 작업에서 실행하려고 하면 동일한 문제가 발생합니다.

답변1

(에서 적응Linux: ssh+screen을 통해 세션을 시작할 때 wmctrl이 디스플레이를 열지 못함)

표시 및 권한

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

  • 표시해야 하는 주소는 일반적으로 :0로컬로 로그인할 때의 주소 :10이거나 :11원격으로 로그인할 때의 주소입니다(그러나 이 숫자는 활성 X 연결 수에 따라 변경될 수 있습니다). 모니터의 주소는 일반적으로 DISPLAY환경 변수에 표시됩니다.

  • 비밀번호를 보여줘야 합니다. X는 비밀번호가 호출되었음을 나타냅니다.마법의 쿠키. 매직 쿠키는 직접 지정되지 않습니다. 항상 :42"display has cookie" 형식의 레코드 모음 인 X 권한 파일에 저장됩니다 123456. X 권한 파일은 일반적으로 환경 변수에 표시됩니다 XAUTHORITY. 설정하지 않으면 $XAUTHORITY프로그램은 를 사용합니다 ~/.Xauthority.

바탕화면에 표시된 창에서 작업을 시도하고 있습니다. 귀하가 데스크톱 컴퓨터를 사용하는 유일한 사람이라면 귀하의 표시 이름은 아마도 입니다 :0. X 권한 파일의 위치를 ​​찾는 것은 Debian squeeze 또는 Ubuntu 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
    
  • DISPLAY합계 값을 XAUTHORITY파일에 저장하고 해당 값을 불러올 수도 있습니다. 존재하다 ~/.profile:

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

    SSH 세션에서:

    . ~/.local-display-setup.sh
    screen
    
  • 실행 중인 프로세스의 값을 감지할 수 있습니다 DISPLAY. XAUTHORITY이는 자동화하기가 더 어렵습니다. 사용하려는 모니터에 연결된 프로세스의 PID를 알아낸 후 /proc/$pid/environ( 1)에서 eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')환경변수를 얻어와야 합니다 .

쿠키 복사

다른 방법 (제안대로애로우 킹)는 ssh 세션에서 값을 가져오려고 시도하지 않고 $XAUTHORITYX 세션이 쿠키를 에 복사하도록 하는 것입니다 ~/.Xauthority. 로그인할 때마다 쿠키가 생성되기 때문입니다 ~/.Xauthority.

원격 관리자가 해당 내용을 볼 수 있도록 허용하는 NFS 또는 기타 네트워크 파일 시스템을 통해 홈 디렉토리에 액세스할 수 있는 경우 보안 문제가 발생할 수 있습니다. X TCP 연결을 활성화하지 않는 한(데비안은 기본적으로 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

1 원칙적으로 올바른 인용이 부족하지만 이 특별한 경우에는 $DISPLAY$XAUTHORITY메타 문자가 포함되지 않습니다.

답변2

다음을 추가하여 해결되었습니다.

xhost +si:localuser:$USER

도착하다 ~/.xprofile. 이것이 완전히 안전한지는 모르겠지만(지식이 풍부한 사람들의 생각을 듣고 싶습니다) xhost +일반적으로 제안한 것처럼 액세스 제어를 끄는 것보다 훨씬 낫다고 생각합니다. 문제를 구글링하는 중.

답변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"

관련 정보