이것은 Linux 용 Windows-Subsystem의 특정 정보로 다른 답변을 보완합니다. 허용 대답은 올바른 : 당신의 DISPLAY
변수가 잘못 구성되어 있습니다. 그러나 왜 그 대답만이 그런지 명확하지는 않으므로이 답변을 수정하고 있습니다.
리눅스, 그리고 X11을 위해 Cygwin에서, 또는 윈도우 서브 시스템을 실행하는 경우 서버는 Windows 기반 (예이고 VcXsrv
, 나 XMing
), 그것은 (예 : 더 가능성이 X11 서버가 TCP 포트에서 수신되는 것입니다 127.0.0.1
TCP 포트에서 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 전달을 중첩) 경우에 해당됩니다.
strace -fo /tmp/trace ssh....
유닉스 도메인 소켓을 연결하려고 시도하는지 확인하는 데 사용 합니다.