Ceci complète d'autres réponses avec des informations spécifiques de Windows-Subsystem for Linux. La réponse acceptée est correcte: votre DISPLAY
variable est configurée de manière incorrecte. Cependant, la raison de cette réponse n’est pas tout à fait claire. C’est pourquoi je vais remédier à cette situation.
Si vous utilisez cygwin ou Windows-Subsystem for Linux et que votre serveur X11 est basé sur Windows (par exemple VcXsrv
, ou XMing
), il est plus probable que votre serveur X11 écoute sur un port TCP (tel que 127.0.0.1
sur les ports TCP 6000-6010
) que sur le socket de domaine Unix par défaut ( /tmp/.X11-unix/X0
). Les sockets Unix ne sont pas bien supportés sous Windows pour le moment, même dans WSL. La communication entre des programmes dans un environnement de type Linux et des programmes exécutés directement sur l'hôte Windows est également généralement plus facile via des sockets IP.
Lorsque vous exécutez des applications graphiques localement (à partir de l'environnement Cygwin ou WSL de votre hôte) et que votre DISPLAY
variable est définie sur la valeur par défaut (c'est-à-dire DISPLAY=:0.0
), les applications tenteront d'abord de se connecter au serveur X via le socket Unix /tmp/.X11-unix/X0
. Cela échouera, mais la plupart des applications retomberont sur une connexion TCP localhost
, ce qui devrait permettre d’atteindre le serveur, à condition que votre serveur X soit configuré avec les valeurs par défaut.
Vous pouvez confirmer que cela se produit en recherchant les connect()
appels dans les journaux strace à partir d'une exécution de votre application graphique. Celles-ci se produiraient généralement tôt, avant que la fenêtre principale de l'application n'apparaisse.
Ce comportement de repli ne se produit pas lorsque ssh redirige une connexion du côté distant, vous obtenez donc cette erreur. sshd
est effectivement en train de transférer la connexion au côté local, mais la connexion locale du client ssh est sans issue car il ne parvient pas à atteindre le serveur via le socket Unix. Vous obtenez alors l' ENOENT
erreur.
Dans de tels cas, changer votre DISPLAY
variable pour utiliser la syntaxe TCP au lieu de la :0.0
syntaxe peut résoudre le problème:
DISPLAY=127.0.0.1:0 ssh remote some-gui-application
Comme d'autres réponses, vous pouvez également exporter cette variable de manière interactive à partir de votre invite de commande:
$ export DISPLAY=127.0.0.1:0
...
$ ssh remote some-gui-application
Vous pouvez également stocker ce paramètre de manière plus permanente en ajoutant cette ligne à votre script d'initialisation de profil de shell de connexion (par exemple ~/.bash_profile
).
Remarque: Certains shells ont un script d'initialisation différent pour les sessions avec ou sans connexion. Par exemple, avec bash, vous pouvez écrire cette ligne dans le script sans connexion, c'est ~/.bashrc
-à- dire au lieu de ~/.bash_profile
. Si vous le faites, veillez à ne pas remplacer la valeur personnalisée éventuellement définie par ssh. Ce serait le cas si vous sautiez d'abord dans votre hôte via ssh, puis de nouveau dans un autre hôte (imbriquant ainsi votre transfert X11).
strace -fo /tmp/trace ssh....
pour vérifier qu'il essaie de connecter ce socket de domaine Unix.