옛날 옛적에,
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
:42
has cookie123456
” 형식의 레코드 모음입니다 . 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
-
또한의 값을 절약 할 수
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
(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"