X11 전달 시도가 "connect /tmp/.X11-unix/X0: 해당 파일 또는 디렉터리 없음" 메시지와 함께 실패하는 이유는 무엇입니까?

X11 전달 시도가 "connect /tmp/.X11-unix/X0: 해당 파일 또는 디렉터리 없음" 메시지와 함께 실패하는 이유는 무엇입니까?

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

ssh -X [email protected]

(완전성을 위해 -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-forwarding을 문제없이 사용해왔는데, 한동안은 아니었지만...

참고용으로 서버의 uname -a:

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

몇 시간 동안 온라인으로 검색했지만 성공하지 못했습니다. 다른 사람들도 같은 문제를 언급했지만 해결책은 없었습니다.

답변1

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

내 $DISPLAY 변수는 Cygwin에서 ":0.0"이며 로컬에서는 작동하지만 원격 SSH 명령에서는 작동하지 않습니다.

로컬 컴퓨터에서 변수를 "localhost:0.0"으로 변경하면 문제가 해결되었습니다.

export DISPLAY=localhost:0.0

이 작업을 수행하면 내 명령이 작동했습니다.

ssh -Yf user@host gvim somefile.c

답변2

X 서버가 실행 중이고 DISPLAY환경 변수가 로 설정된 경우 :0이는 일반적으로 Linux에서 발견되는 Unix 도메인 소켓을 사용하여 X 서버에 연결하도록 애플리케이션에 지시합니다 /tmp/.X11-unix/X0(아래 참조).추상 네임스페이스최근 Linux에서는).

SSH로 머신에 접속할 때원격 기계, sshd존재하다원격 기계예를 들어 DISPLAY를 설정하면 localhost:10X 연결이 실제로 TCP를 통해 컴퓨터 로컬 호스트의 포트 6010에 수행된다는 의미입니다. SSHD 열기원격 기계거기에서 연결을 수신하고 들어오는 연결을 SSH 클라이언트로 전달합니다. 그런 다음 SSH 클라이언트는 /tmp/.X11-unix/X0X 서버에 연결하기 위해(원격이 아닌 로컬 측에서) 연결을 시도합니다.

이제 실행 중인 X 서버가 없거나(Mac을 사용하고 있습니까?) /tmp/.X11-unix에서 unix 도메인 소켓을 찾을 수 없습니다. 이는 ssh가 다음 위치에 올바르게 구성되지 않았음을 의미합니다. 컴파일 시간.

Unix 소켓에 대한 올바른 경로를 찾으려면 strace -e connect xlogo로컬 컴퓨터(또는 시스템의 동등한 경로)에서 이를 시도하여 일반 X 응용 프로그램이 수행하는 작업을 확인할 수 있습니다.

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

참고로 Linux Debian 시스템에서 Xorg는 /tmp/.X11-unix/X0파일 시스템을 수신 /tmp/.X11-unix/X0하고추상 네임스페이스(보통 으로 쓴다 @/tmp/.X11-unix/X0). 처음부터 straceX11 응용 프로그램은 이제 기본적으로 이 추상 네임스페이스를 사용하는 것으로 나타납니다. 이는 제거된 응용 프로그램이 이 추상 네임스페이스를 사용 /tmp/.X11-unix하지 않고도 여전히 작동하는 이유를 설명합니다.ssh

답변3

이는 WSL(Linux용 Windows 하위 시스템)의 특정 정보가 포함된 다른 답변에 추가됩니다. 이것수락된 답변정확합니다: DISPLAY변수가 잘못 구성되었습니다. 하지만 이 답변만으로는 왜 이런 일이 발생하는지 명확하지 않으므로 이 답변을 사용하여 문제를 해결하고 있습니다.

cygwin 또는 Linux용 Windows 하위 시스템을 실행 중이고 X11 서버가 Windows 기반(예 VcXsrv: 또는 )인 경우 X11 서버는 기본 포트가 아닌 XMingTCP 포트(예: Unix 127.0.0.1포트 )에서 수신 대기할 가능성이 더 높습니다. 6000-6010포트 Unix DomainSocket( /tmp/.X11-unix/X0). 현재 Unix 소켓은 WSL에서도 Windows에서 잘 지원되지 않습니다. 또한 일반적으로 Linux와 유사한 환경의 프로그램과 IP 소켓을 통해 Windows 호스트에서 직접 실행되는 프로그램 간의 통신이 더 쉽습니다.

그래픽 애플리케이션을 로컬로(즉, 호스트의 Cygwin 또는 WSL 환경에서) 실행하고 DISPLAY변수가 기본값(즉 DISPLAY=:0.0)으로 설정된 경우 애플리케이션은 먼저 Unix를 통해 X 서버에 연결을 시도합니다. 소켓 /tmp/.X11-unix/X0. 이 작업은 실패하지만 대부분의 응용 프로그램은 localhostX 서버가 기본값으로 구성되어 있다고 가정하고 서버에 성공적으로 연결되는 TCP 연결로 대체됩니다 .

connect()실행 중인 그래픽 응용 프로그램의 추적 로그에서 호출을 찾아 이 문제가 발생하는지 확인할 수 있습니다. 이는 일반적으로 응용 프로그램의 기본 창이 나타나기 전에 발생합니다.

키 포인트:SSH가 원격 측에서 연결을 리디렉션하면 이 대체 동작이 발생하지 않으므로 오류가 발생합니다. sshd원격에 있는 것은 X11 연결을 로컬 측으로 전달하지만 SSH 클라이언트의 로컬 연결은 Unix 소켓을 통해 서버에 연결할 수 없기 때문에 종료됩니다. 그러면 ENOENT오류가 발생합니다 . TCP 로컬 호스트에 대한 대체 연결을 시도하지 않습니다.

수리하다:이 경우 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 전달이 중첩됨).

답변4

방금 같은 문제가 발생했습니다. 혼란스럽게도 no-such-file 오류가 발생합니다.외딴컴퓨터에 있지만 파일이 실제로 켜져 있습니다.현지의(디스플레이) 기계.

어떤 일이 일어나는지 확인하기 위해 다음과 같이 디스플레이 시스템에 누락된 파일(실제로 fifo)을 수동으로 생성했습니다.

mkfifo /tmp/.X11-unix/X0

그런 다음 원격 컴퓨터에 다시 SSH를 통해 접속해 보세요. X11 연결이 제대로 작동합니다.

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

관련 정보