To uzupełnia inne odpowiedzi o informacje specyficzne dla systemu Windows dla podsystemu Linux. Odpowiedź akceptowana jest poprawna: Twój DISPLAY
zmienna jest nieprawidłowo skonfigurowana. Jednak nie jest do końca jasne, dlaczego tak jest z samą odpowiedzią, więc naprawiam tę odpowiedź.
Jeśli korzystasz z Cygwina lub podsystemu Windows dla systemu Linux, a Twój serwer X11 jest oparty na systemie Windows (np. VcXsrv
Lub XMing
), bardziej prawdopodobne jest, że Twój serwer X11 nasłuchuje na porcie TCP (na przykład 127.0.0.1
na portach TCP 6000-6010
) niż na domyślne gniazdo domeny Unix ( /tmp/.X11-unix/X0
). Gniazda uniksowe nie są obecnie obsługiwane w systemie Windows, nawet w WSL. Komunikacja między programami w środowisku podobnym do systemu Linux a programami działającymi bezpośrednio na hoście systemu Windows jest również ogólnie łatwiejsza w przypadku gniazd IP.
Kiedy uruchamiasz aplikacje graficzne lokalnie (np. Ze środowiska Cygwin lub WSL twojego hosta), a twoja DISPLAY
zmienna jest ustawiona na domyślną (tj. DISPLAY=:0.0
), Aplikacje najpierw spróbują połączyć się z serwerem X przez gniazdo Unix /tmp/.X11-unix/X0
. To się nie powiedzie, ale większość aplikacji wróci do połączenia TCP localhost
, które powinno osiągnąć połączenie z serwerem, zakładając, że Twój serwer X jest skonfigurowany z ustawieniami domyślnymi.
Możesz potwierdzić, że tak się dzieje, szukając connect()
połączeń w dziennikach śledzenia z przebiegu aplikacji graficznej. Z reguły miałyby to miejsce wcześnie, zanim pojawi się główne okno aplikacji.
To zachowanie awaryjne nie występuje, gdy ssh przekierowuje połączenie ze strony zdalnej, więc pojawia się ten błąd. sshd
faktycznie przekazuje połączenie do strony lokalnej, ale lokalne połączenia klienta ssh są ślepe, ponieważ nie dociera do serwera przez gniazdo Unix. Otrzymujesz wtedy ENOENT
błąd.
W takich przypadkach zmiana DISPLAY
zmiennej na użycie składni TCP zamiast :0.0
składni może rozwiązać problem:
DISPLAY=127.0.0.1:0 ssh remote some-gui-application
Jak wspomniano w innych odpowiedziach, można również wyeksportować tę zmienną interaktywnie z wiersza poleceń powłoki:
$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application
Możesz także zapisać to ustawienie bardziej trwale, dodając tę linię do skryptu inicjującego profil powłoki powłoki (np ~/.bash_profile
.).
Uwaga: Niektóre powłoki mają inny skrypt inicjujący dla sesji logowania i bez logowania. Na przykład, dzięki bashowi możesz napisać tę linię do skryptu bez logowania, tj. ~/.bashrc
Zamiast ~/.bash_profile
. Jeśli to zrobisz, uważaj, aby nie przesłonić żadnych wartości niestandardowych, które mogły zostać ustawione przez ssh. Tak byłoby w przypadku, gdy najpierw wskakiwałeś na swój host przez ssh, a następnie ponownie wskakiwałeś na inny host (zagnieżdżając w ten sposób przekazywanie X11).
strace -fo /tmp/trace ssh....
sprawdzić, czy próbuje połączyć to gniazdo domeny Unix.