"connect /tmp/.X11-unix/X0 : 해당 파일 또는 디렉토리가 없습니다"로 X11 전달 시도가 실패하는 이유는 무엇입니까?


33

내 로컬 컴퓨터에서 다음을 실행합니다.

ssh -X me@remotemachine.com

(완전성을 위해 동일한 결과로 -Y를 사용하여 다음을 모두 테스트했습니다.)

예상대로 이것은 remotemachine.com에 잘 액세스하며 모두 잘 나타납니다. 그러나 xcalc를 실행하려고하면 다음과 같은 결과가 나타납니다.

 connect /tmp/.X11-unix/X0: No such file or directory
 Error: Can't open display: localhost:10.0

그러나,

$ ls -la /tmp/.X11-unix/
total 36
drwxrwxrwt 2 root root  4096 2012-11-23 09:29 .
drwxrwxrwt 8 root root 32768 2012-11-29 08:22 ..
srwxrwxrwx 1 root root     0 2012-11-23 09:29 X0

따라서 /tmp/.X11-unix/X0이 존재할뿐만 아니라 범용 r / w / x 권한이 있습니다!

이전에는 문제없이 x 전달을 사용했지만 시간이 지났습니다 ...

참조를 위해 서버의 uname -a :

Linux machinename 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux

성공하지 않고 몇 시간 동안 웹을 검색했습니다. 같은 문제에 대한 다른 언급이지만 해결책은 없습니다.


원격 시스템이 아닌 여기에서 확인해야하는 파일은 로컬 시스템의 파일입니다. strace -fo /tmp/trace ssh....유닉스 도메인 소켓을 연결하려고 시도하는지 확인하는 데 사용 합니다.
Stéphane Chazelas

아! 그럴 수 있습니다. 이상하게도 내 로컬 컴퓨터에는 /tmp/.X11-unix/ 디렉토리가 없습니다.
John Doucette

답변:


24

X 서버가 실행 중이고 DISPLAY환경 변수가로 설정된 :0경우 일반적으로 Linux에서 찾을 수있는 유닉스 도메인 소켓을 사용하여 X 서버에 연결하도록 응용 프로그램에 지시합니다 /tmp/.X11-unix/X0( 최근 Linux 의 추상 네임 스페이스 에 대해서는 아래 참조 ). .

당신이 기계에 ssh를 할 때 remotemachine , sshdremotemachine의 에 세트 DISPLAY localhost:10(예를 들어), 어떤 X 연결이 기계 로컬 호스트의 포트 6010에 TCP를 통해 수행 할 수 않는 것을이 시간을 의미합니다. 에 SSHD remotemachine의 존재에 대한 연결 및 SSH 클라이언트에 전달 들어오는 연결을 수신합니다. 그런 다음 ssh 클라이언트는 /tmp/.X11-unix/X0X 서버에 연결하기 위해 (원격이 아닌 로컬 끝에서) 연결을 시도 합니다.

이제 X 서버가 실행 중이 아니거나 (Mac에 있습니까?) 유닉스 도메인 소켓이 /tmp/.X11-unix에 없으면 ssh가 컴파일시 올바르게 구성되지 않았 음을 의미합니다 시각.

유닉스 소켓에 대한 올바른 경로를 파악하기 strace -e connect xlogo위해 로컬 시스템에서 (또는 시스템에서 동등한 경로) 시도 하여 일반 X 응용 프로그램의 기능을 확인할 수 있습니다.

netstat -x | grep X 단서를 줄 수도 있습니다.

모두에서 씩씩 거리는 기계 여기 데비안 리눅스에 기록, Xorg를 듣는다을 위해 /tmp/.X11-unix/X0파일 시스템과 /tmp/.X11-unix/X0상의 추상적 인 공간 (일반적으로 작성 @/tmp/.X11-unix/X0). 에서 strace, X11 응용 프로그램은 이제 그 여전히 일 경우 이유를 설명 기본적으로 그 추상적 인 네임 스페이스를 사용하는 것 /tmp/.X11-unix동안, 제거를 ssh하는 추상적 인 네임 스페이스를 사용하지 않습니다.


1
또는 확인 lsof -p <PID of your local X server>당신이 찾을 수 있어야 할 곳에 /some/thing/Xn파일의 n존재 귀하의 DISPLAY수입니다.
peterph

고마워, 이것은 매우 도움이되었습니다. 어떻게 든 X 서버가 여전히 실행 중이지만 내 /tmp/.X11-unix/X0 파일이 제거되었습니다. 빠른 재부팅으로 문제가 해결 된 것 같습니다. 어쩌면 내가 잠시 전에 한 일부 업데이트로 인해 발생했을 수 있습니다.
John Doucette

6
DISPLAY 변수를 ": 0.0"에서 "localhost : 0.0"으로 변경하면 적어도 Cygwin에서 Linux로 연결하는 것이 속임수입니다.
m0j0

FWIW, 로컬 Windows를 원격 유닉스에 연결했기 때문에 호스트 에서 startxwin(이후 apt-cyg install xinit) 실행해야했습니다cygwin
Jonathan

39

Cygwin 및 Xming과 동일한 문제가 발생하여 원격 Linux 서버에 연결했습니다.

내 $ DISPLAY 변수는 Cygwin에서 단순히 ": 0.0"이었으며 로컬에서는 작동하지만 원격 ssh 명령으로는 작동하지 않았습니다.

변수를 "localhost : 0.0"으로 변경하면 문제가 해결되었습니다.

export DISPLAY=localhost:0.0

일단 그렇게하면 내 명령이 효과가있었습니다.

ssh -Yf user@host gvim somefile.c

5
이것은 Linux 용 Windows 서비스를 사용하는 경우에도 문제가되었습니다.
lapo

1
어느 서버에서 export ...명령 을 실행 했 습니까? 1) 로컬 머신 2) 서버
abalter

1
@abalter 그것은 로컬 머신에서 실행
하는데 효과적이었다

3
설정했기 때문에 Cygwin ssh + VcXsrv에서 2 시간 동안 디버깅 문제를 보냈습니다 DISPLAY=:0 ssh -Y $host. 그것을 DISPLAY=localhost:0마술처럼 해결 한 문제 로 바 꾸었습니다.
gavenkoa

1
정답, 여전히 Windows에서 우분투 하위 시스템 실행에 도움이 됨
Tom Swifty

6

이것은 Linux 용 Windows-Subsystem의 특정 정보로 다른 답변을 보완합니다. 허용 대답은 올바른 : 당신의 DISPLAY변수가 잘못 구성되어 있습니다. 그러나 왜 그 대답만이 그런지 명확하지는 않으므로이 답변을 수정하고 있습니다.

리눅스, 그리고 X11을 위해 Cygwin에서, 또는 윈도우 서브 시스템을 실행하는 경우 서버는 Windows 기반 (예이고 VcXsrv, 나 XMing), 그것은 (예 : 더 가능성이 X11 서버가 TCP 포트에서 수신되는 것입니다 127.0.0.1TCP 포트에서 6000-6010보다) 기본 Unix 도메인 소켓 ( /tmp/.X11-unix/X0) 이 시점에서 WSL 내부에서도 Windows에서 유닉스 소켓이 제대로 지원되지 않습니다. Linux와 유사한 환경의 프로그램과 Windows 호스트에서 직접 실행되는 프로그램 간의 통신은 일반적으로 IP 소켓을 통해 더 쉽습니다.

로컬에서 (예 : 호스트의 Cygwin 또는 WSL 환경에서) 그래픽 응용 프로그램을 실행하고 DISPLAY변수가 기본값으로 설정된 경우 (예 :) DISPLAY=:0.0응용 프로그램은 먼저 Unix 소켓을 통해 X 서버에 연결을 시도합니다 /tmp/.X11-unix/X0. 이것은 실패하지만 대부분의 응용 프로그램은에서 TCP 연결로 폴백합니다. localhost그러면 X 서버가 기본값으로 구성되어 있다고 가정하면 서버에 성공적으로 도달합니다.

connect()그래픽 응용 프로그램 실행에서 strace 로그에서 호출 을 찾아서 이러한 상황이 발생하고 있음을 확인할 수 있습니다. 일반적으로 응용 프로그램의 기본 창이 나타나기 전에 일찍 발생합니다.

ssh가 원격에서 연결을 리디렉션 할 때 해당 폴백 동작이 발생하지 않으므로 해당 오류가 발생합니다. sshd실제로 연결을 로컬 측으로 전달하고 있지만 ssh 클라이언트의 로컬 연결은 Unix 소켓을 통해 서버에 도달하지 못하여 막 다른 골목에 있습니다. 그런 다음 ENOENT오류가 발생합니다.

이러한 경우 DISPLAY구문 대신 TCP 구문을 사용하도록 변수를 변경 :0.0하면 문제가 해결 될 수 있습니다.

DISPLAY=127.0.0.1:0 ssh remote some-gui-application

다른 답변에서 언급했듯이 쉘 프롬프트에서 해당 변수를 대화식으로 내보낼 수도 있습니다.

$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application

로그인 쉘 프로파일 초기화 스크립트 (예 :)에 해당 행을 추가하여이 설정을보다 영구적으로 저장할 수도 있습니다 ~/.bash_profile.

참고 : 일부 셸에는 로그인 및 비 로그인 세션에 대해 다른 초기화 스크립트가 있습니다. 예를 들어, bash를 사용하면 해당 줄을 비 로그인 스크립트 (예 ~/.bashrc: 대신)에 쓸 수 ~/.bash_profile있습니다. 이 경우 ssh에서 설정 한 사용자 정의 값을 대체하지 않도록주의하십시오. ssh를 통해 호스트에 먼저 호핑 한 다음 다른 호스트에 다시 호핑하는 경우 (X11 전달을 중첩) 경우에 해당됩니다.


3

디스플레이 호스트가 macOS 인 경우 XQuartz가 실행 중인지 확인하십시오 .

이 오류 메시지는 ssh 터널이 작동하고 있음을 알려주지 만 터널 쪽의 X 서버에 연결하는 방법을 알 수 없습니다 .

예전에는 Mac OS X에서 XQuartz를 시작했지만, macOS 버전의 터미널 에서는이 멋진 기능을 버렸습니다 .


후속 조치 : Invalid MIT-MAGIC-COOKIE-1 keyxterm Xt error: Can't open display: localhost:10.0"XQuartz를 시작한 후 종료하고 SSH를 다시 ​​시작해야 함"을 의미 합니다.
rogerdpack

1

방금 같은 문제가있었습니다. 혼란스러운 점은 원격 시스템에서 파일 없음 오류가 발생 하지만 실제로는이 파일이 로컬 (디스플레이) 시스템 에서 누락 된 것 입니다.

무슨 일이 일어날 지 알기 위해 디스플레이 머신에서 다음과 같이 누락 된 파일 (실제로 50)을 수동으로 만들었습니다.

mkfifo /tmp/.X11-unix/X0

그런 다음 원격 시스템에 다시 ssh'ed하고 X11이 잘 연결되었습니다.

이것이 관련이 있는지 모르겠지만 디스플레이 시스템이 Linux가 아니며 cygwin 및 VcXsrv가있는 Windows입니다. (원격 컴퓨터는 Linux입니다)


4
/tmp/.X11-unix/X0FIFO가 아닌 유닉스 도메인 소켓입니다
Samveen

0

Linux 용 Windows 하위 시스템을 사용하여이 문제가 발생했습니다 . 문제는 Windows 시스템이기 때문에 GUI가 있다고 가정하기 때문에 클라이언트에 GUI가 설치되어 있지 않다는 것입니다.

GUI가 있는지 테스트하려면 xclock클라이언트 에서 실행 하십시오. 오류가 발생 Error: Can't open display: :0하면 Windows 용 GUI 프로그램을 설치해야합니다. 나는 Xserver를 사용했다 .

GUI가 설치되면 다음 명령을 시도하십시오.

export DISPLAY=:0
xclock

시계가 오면 성공!

이제 서버에 ssh'ing하고 실행하십시오 xclock. connect /tmp/.X11-unix/X0 오류 메시지가 계속 표시 됩니까? 해당 파일 또는 디렉토리가 없습니다. 오류 : 표시를 열 수 없습니다 : localhost : 10.0 ? 서버가 GUI에 표시하기 위해 자체적으로 연결하려고하기 때문입니다. 대신 DISPLAY 변수를 서버가 컴퓨터를 얻을 수있는 주소로 설정하려고합니다. LAN에 있다면 컴퓨터 이름 만 입력하면됩니다. WAN의 서버에 연결하는 경우 라우터의 외부 IP를 지정하고 올바른 포트를 전달해야합니다.

LAN : export DISPLAY=ComputerName:0
WAN :export DISPLAY=257.257.257.257:0


"X 포워딩"은 "원격 시스템 (서버의 경우 서버)에서 실행중인 응용 프로그램에서 로컬 시스템 (클라이언트의 경우)으로 X 프로토콜을 터널링"을 의미하므로 물론 X 서버를 실행해야합니다. 로컬 시스템의 "모든 GUI 프로그램" "GUI가 있더라도"Windows 자체는 X 프로토콜을 이해하지 못합니다.
dirkt

-2

제대로 작동하고 적절한 이유없이 작동을 중단 한 경우 백그라운드에서 제어되지 않는 X 인스턴스가 실행되었을 수 있습니다. 작업 관리자를 사용하여 닫으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.