L'indicateur -X (transfert X11) ne semble pas fonctionner sous Windows

16

J'utilise Open SSH (OpenSSH_6.6.1p1, OpenSSL 1.0.1i 6 août 2014) dans Windows 8.1. Le transfert X11 ne semble pas fonctionner. La variable d'environnement DISPLAY ne semble pas être définie.

Par exemple, si j'utilise BitVise ou Putty pour me connecter et exécuter env, je vois:

[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

Si j'utilise plutôt 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
la source
1
Cela peut être évident, mais je ne peux pas le dire avec certitude dans votre message - avez-vous réellement un serveur X installé sur Windows, par exemple en suivant bitvise.com/ssh-x11-forwarding ?
1
Oui, j'ai Xming X Server ( straightrunning.com/xmingnotes )
abendigo
Avez-vous - juste pour tester des choses - essayé la même chose avec PuTTY? Sinon, je suggère d'essayer avec cela et de voir si cela fonctionne là-bas.
polemon
1
oui, ça marche en mastic.
abendigo
Je vérifie ma machine virtuelle Windows en ce moment. Cela pourrait être aussi simple que de vérifier quel type de variables PuTTY définit pour que cela fonctionne. J'ajouterai une réponse dans quelques heures.
polemon

Réponses:

16

Avez-vous défini DISPLAYune variable d'environnement sur le client? Je ne sais pas quel shell vous utilisez, mais avec le dérivé du shell Bourne (comme bash), veuillez essayer:

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

Ou si vous utilisez cmd.exe:

set DISPLAY=127.0.0.1:0
ssh -X marko@vm
yaegashi
la source
Merci, c'est exactement ce qui me manquait! J'attribuerai la prime dès que je serai autorisé.
abendigo
Notez que j'ai voté pour la réponse de roaima (ci-dessous), car elle décrit pourquoi et donne simplement une réponse.
Azhrei
2
La réponse de roaima explique donc pourquoi le problème s'est produit, mais cela ne m'a pas aidé à résoudre le problème. J'ai expliqué dans ma question que j'utilisais Windows. La réponse de Yaegashi m'a donné une commande pour entrer sur les fenêtres qui ont résolu mon problème. c'est pourquoi j'ai choisi cette réponse.
abendigo
J'ai enregistré un compte juste pour voter cette réponse. J'avais cherché sur Internet depuis longtemps avant d'arriver ici.
Rio Wing
3
Cette solution ne fonctionne pas pour moi. set DISPLAY=anythingsuivi de ssh -X user@remoteretours La CreateProcessW failed error:2 ssh_askpass: posix_spawn: No such file or directory Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).suppression de la variable d'environnement avec set DISPLAY=me permet de réussir ssh à nouveau, mais sans travailler avec le transfert X. Cela n'a aucun sens pour moi que le réglage de DISPLAY devrait amener le logiciel à demander mon mot de passe de cette façon. github.com/PowerShell/Win32-OpenSSH/issues/1088 github.com/PowerShell/Win32-OpenSSH/issues/1088
Pavel Komarov
14

Lorsque vous exécutez ssh -X remotehostet que vous êtes DISPLAY=localhost:10présenté à l'hôte distant. sshécoute sur ce port et retransmet le trafic vers le système appelant, en utilisant sa valeur d'origine de DISPLAYpour déterminer l'adresse du serveur.

Il est probable que vous en ayez sur votre système local DISPLAY=:0. Ou si vous ne l'avez pas fait, c'est ce qui est par défaut. Cela indique au système local d'utiliser le socket de domaine UNIX pour communiquer avec l'écran. Malheureusement, Xmingsous Windows ne configure pas ce socket de domaine UNIX, votre sshtransfert X11 échoue avec ce type d'erreur:

$ 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

La solution - du moins pour autant Xming- est assez simple. Modifiez la DISPLAYvariable pour référencer un socket TCP d'écoute plutôt qu'un socket de domaine UNIX.

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

Vous devrez peut-être adapter votre Xmingconfiguration pour écouter sur le port TCP local 6000. Voici comment commencer Xming:

Xming.exe :0 -clipboard -multiwindow

Et voici des preuves pour confirmer que vous Xmingécoutez sur le port TCP / 6000:

$ netstat -na | grep ':6000 .*LISTEN'
  TCP    0.0.0.0:6000           0.0.0.0:0              LISTENING
roaima
la source
Merci, j'ai eu exactement ce problème! Je ne savais pas que: 0 signifie que la connexion se fait via une prise. J'ai toujours pensé que c'était juste un raccourci pour localhost: 0.
Andreas Raster
J'ai eu le même problème avec Bash pour Ubuntu pour Windows et Xming, et cela l'a résolu! Je devais juste régler DISPLAY sur localhost:0.
Ben Richards
Une idée pourquoi DISPLAY=:0fonctionne bien sur WSL + XMing pour xeyes, mais pas pour ssh -X? Est - ssh -Xinterprète $ DISPLAY différemment des autres clients locaux X11? Les autres clients X11 se replient-ils automatiquement localhost:0mais ssh -Xne le font pas?
Markus Kuhn
On man Xy dit que le nom d'hôte vide dans DISPLAY =: 0 signifie "Le transport local le plus efficace sera choisi." Alors peut-être ssh -Xutilise un algorithme différent pour le faire par rapport à dire xeyes?
Markus Kuhn
@MarkusKuhn peut-être que WSL + Xming est différent de Cygwin + Xming. Je vois que j'utilise maintenant DISPLAY=:0et le ssh -Xtransmet avec bonheur.
roaima