Flaga X (przekazywanie X11) nie działa w systemie Windows

16

Korzystam z Open SSH (OpenSSH_6.6.1p1, OpenSSL 1.0.1i 6 sierpnia 2014) w systemie Windows 8.1. Przekazywanie X11 nie działa. Zmienna środowiskowa DISPLAY nie wydaje się być ustawiona.

Na przykład, jeśli używam BitVise lub Putty do łączenia się i uruchamiania env, widzę:

[marko@vm:~]$ env
XDG_SESSION_ID=6
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=192.168.1.174 61102 22
SSH_TTY=/dev/pts/0
USER=marko
MAIL=/var/mail/marko
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PWD=/home/marko
LANG=en_CA.UTF-8
NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
SHLVL=1
HOME=/home/marko
LANGUAGE=en_CA:en
LOGNAME=marko
SSH_CONNECTION=192.168.1.174 61102 192.168.1.64 22
XDG_RUNTIME_DIR=/run/user/1000
DISPLAY=localhost:10.0
_=/usr/bin/env

Jeśli zamiast tego użyję OpenSSH (ssh -X marko @ vm):

[marko@vm:~]$ env
XDG_SESSION_ID=8
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=192.168.1.174 61150 22
SSH_TTY=/dev/pts/1
USER=marko
MAIL=/var/mail/marko
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PWD=/home/marko
LANG=en_CA.UTF-8
NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
SHLVL=1
HOME=/home/marko
LANGUAGE=en_CA:en
LOGNAME=marko
SSH_CONNECTION=192.168.1.174 61150 192.168.1.64 22
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/env
abendigo
źródło
1
Może to być oczywiste, ale nie mogę z całą pewnością stwierdzić na podstawie twojego postu - czy faktycznie masz zainstalowany serwer X w systemie Windows, np. Śledząc bitvise.com/ssh-x11-forwarding ?
1
Tak, mam Xming X Server ( straightrunning.com/xmingnotes )
abendigo
Czy próbowałeś już tego samego z PuTTY? Jeśli nie, proponuję spróbować z tym i sprawdzić, czy to działa.
polemon
1
tak, działa w kitach.
abendigo,
Sprawdzam teraz moją maszynę wirtualną z systemem Windows. Może to być tak proste, jak sprawdzenie, jakie zmienne ustawia PuTTY, aby to działało. Dodam odpowiedź za kilka godzin.
polemon

Odpowiedzi:

16

Czy ustawiłeś DISPLAYzmienną środowiskową na kliencie? Nie jestem pewien, której powłoki używasz, ale z pochodną powłoki Bourne'a (jak bash), spróbuj:

export DISPLAY=127.0.0.1:0
ssh -X marko@vm

Lub jeśli używasz cmd.exe:

set DISPLAY=127.0.0.1:0
ssh -X marko@vm
yaegashi
źródło
Dziękuję, właśnie tego mi brakowało! Przyznam nagrodę, gdy tylko pozwolę.
abendigo,
Zauważ, że podniosłem głos Roaima (poniżej), ponieważ opisuje ona powód, a także odpowiedź.
Azhrei,
2
Tak więc odpowiedź roaima wyjaśnia, dlaczego wystąpił problem, ale nie pomogło mi to rozwiązać problemu. W swoim pytaniu wyjaśniłem, że korzystam z systemu Windows. Odpowiedź yaegashi dała mi polecenie wejścia w okna, które rozwiązały mój problem. dlatego wybrałem tę odpowiedź.
abendigo,
Zarejestrowałem konto tylko po to, aby zagłosować na tę odpowiedź. Długo szukałem w Internecie, zanim tu dotarłem.
Rio Wing
3
To rozwiązanie nie działa dla mnie. set DISPLAY=anythingpo których następują ssh -X user@remotepowroty CreateProcessW failed error:2 ssh_askpass: posix_spawn: No such file or directory Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).Odznaczenie zmiennej środowiskowej za pomocą set DISPLAY=pozwala mi ponownie ssh pomyślnie, ale bez pracy przekazywania X. Nie ma dla mnie sensu, że ustawienie WYŚWIETLACZA powinno spowodować, że oprogramowanie poprosi o moje hasło w ten sposób. github.com/PowerShell/Win32-OpenSSH/issues/1088 github.com/PowerShell/Win32-OpenSSH/issues/1088
Pavel Komarov
14

Po uruchomieniu ssh -X remotehosti DISPLAY=localhost:10wyświetleniu się zdalnemu hostowi. sshnasłuchuje na tym porcie i przekazuje ruch z powrotem do systemu wywołującego, korzystając z oryginalnej wartości DISPLAYokreślającej adres serwera.

Prawdopodobnie masz w systemie lokalnym DISPLAY=:0. A jeśli nie, to jest to domyślnie. To instruuje system lokalny, aby używał gniazda domeny UNIX do komunikacji z wyświetlaczem. Niestety Xmingw systemie Windows nie skonfigurowano tego gniazda domeny UNIX, więc sshprzekazywanie X11 kończy się niepowodzeniem z tego rodzaju błędem:

$ export DISPLAY=:0
$ ssh -X remotehost xlogo
connect /tmp/.X11-unix/X0: No such file or directory
Error: Can't open display: localhost:10.0

Poprawka - przynajmniej jeśli chodzi o Xmingto - jest dość prosta. Zmodyfikuj DISPLAYzmienną tak, aby odwoływała się do nasłuchującego gniazda TCP zamiast do gniazda domeny UNIX.

$ export DISPLAY=localhost:0
$ ssh -X remotehost xlogo

Może być konieczne dostosowanie Xmingkonfiguracji do nasłuchiwania na lokalnym porcie TCP 6000. Oto jak zacząć Xming:

Xming.exe :0 -clipboard -multiwindow

A oto dowody potwierdzające, że Xmingnasłuchuje na porcie TCP / 6000:

$ netstat -na | grep ':6000 .*LISTEN'
  TCP    0.0.0.0:6000           0.0.0.0:0              LISTENING
roaima
źródło
Dzięki, miałem dokładnie ten problem! Nie wiedziałem, że: 0 oznacza, że ​​połączenie zostało wykonane przez gniazdo. Zawsze myślałem, że to tylko skrót dla localhost: 0.
Andreas Raster,
Miałem ten sam problem z Bash dla Ubuntu na Windows i Xming i to rozwiązało! Po prostu musiałem ustawić DISPLAY na localhost:0.
Ben Richards,
Każdy pomysł, dlaczego DISPLAY=:0działa dobrze na WSL + XMing dla xeyes, ale nie dla ssh -X? Czy ssh -Xinterpretuje $ DISPLAY inaczej niż inni lokalni klienci X11? Czy inni klienci X11 cofają się automatycznie, localhost:0ale ssh -Xnie robią tego?
Markus Kuhn
Na man Xnim jest napisane, że pusta nazwa hosta w DISPLAY =: 0 oznacza „Wybrany zostanie najbardziej wydajny transport lokalny”. Więc może być ssh -Xużyty do tego inny algorytm w porównaniu do powiedzenia xeyes?
Markus Kuhn
@MarkusKuhn być może WSL + Xming różni się od Cygwin + Xming. Widzę, że teraz używam DISPLAY=:0i ssh -Xprzekazuję to z radością.
roaima