옛날 옛적에,
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 세션에서 값을 가져오려고 시도하지 않고 $XAUTHORITY
X 세션이 쿠키를 에 복사하도록 하는 것입니다 ~/.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"