Pourquoi ma tentative de transfert X11 échoue-t-elle avec «connect /tmp/.X11-unix/X0: Aucun fichier ou répertoire de ce type»?

33

Sur ma machine locale, je lance:

ssh -X [email protected]

(Pour être complet, j'ai également testé tous les éléments suivants en utilisant -Y avec des résultats identiques).

Comme prévu, cela accède à remotemachine.com très bien, et tout semble bien aller. Si je tente ensuite d’exécuter xcalc, j’obtiens:

 connect /tmp/.X11-unix/X0: No such file or directory
 Error: Can't open display: localhost:10.0

Mais,

$ ls -la /tmp/.X11-unix/
total 36
drwxrwxrwt 2 root root  4096 2012-11-23 09:29 .
drwxrwxrwt 8 root root 32768 2012-11-29 08:22 ..
srwxrwxrwx 1 root root     0 2012-11-23 09:29 X0

Ainsi, non seulement /tmp/.X11-unix/X0 existe, il dispose des autorisations universelles r / w / x!

J'ai déjà utilisé x-forwarding sans problème, mais pas depuis longtemps ...

uname -a sur le serveur pour référence:

Linux machinename 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux

Je cherche sur le Web depuis quelques heures sans succès. Autres mentions du même problème, mais pas de solutions.

John Doucette
la source
Notez que c'est le fichier sur la machine locale que vous devez vérifier ici, pas le fichier distant. Je voudrais utiliser strace -fo /tmp/trace ssh....pour vérifier qu'il essaie de connecter ce socket de domaine Unix.
Stéphane Chazelas
Ah! Cela pourrait être ça. Curieusement, ma machine locale ne dispose pas d'un répertoire /tmp/.X11-unix/.
John Doucette

Réponses:

24

Si vous avez un serveur X en cours d'exécution et que la DISPLAYvariable d'environnement est définie sur :0, cela indique aux applications de se connecter au serveur X à l'aide d'un socket de domaine unix qui se trouve généralement sur Linux sous /tmp/.X11-unix/X0(voir toutefois ci-dessous l' espace de noms abstrait sur Linux récent). .

Lorsque vous ssh à la machine remotemachine , sshdsur RemoteMachine ensembles DISPLAY pour localhost:10(par exemple), ce qui signifie que cette fois que les connexions X sont ne se fait sur TCP sur le port 6010 de la machine localhost. sshd on remotemachine écoute les connexions qui s'y trouvent et transmet toute connexion entrante au client ssh. Le client ssh essaie ensuite de se connecter /tmp/.X11-unix/X0(sur le côté local, pas sur le côté distant) pour contacter votre serveur X.

Maintenant, peut-être n'avez-vous pas de serveur X en cours d'exécution (êtes-vous sur Mac?) Ou peut-être que le socket de domaine unix ne se trouve pas dans /tmp/.X11-unix, ce qui voudrait dire que ssh n'a pas été configuré correctement à la compilation temps.

Pour déterminer le chemin approprié pour le socket Unix, vous pouvez essayer un strace -e connect xlogo(ou l’équivalent sur votre système) sur votre ordinateur local pour voir ce que fait une application X normale.

netstat -x | grep X peut également donner un indice.

Pour mémoire, sur une machine Linux Debian Wheezy, Xorg écoute à la fois /tmp/.X11-unix/X0dans le système de fichiers et /tmp/.X11-unix/X0dans l’ espace de noms abstrait (généralement écrit @/tmp/.X11-unix/X0). Depuis strace, les applications X11 semblent maintenant utiliser cet espace de noms abstrait par défaut, ce qui explique pourquoi celles-ci fonctionnent toujours si elles /tmp/.X11-unixsont supprimées, sshsans utiliser cet espace de noms abstrait.

Stéphane Chazelas
la source
1
Ou vérifiez lsof -p <PID of your local X server>où vous devriez pouvoir trouver le /some/thing/Xnfichier, celui-ci nétant votre DISPLAYnuméro.
Peter
Merci, c'était très utile. En quelque sorte, mon fichier /tmp/.X11-unix/X0 a été supprimé, même si un serveur X était toujours en cours d'exécution. Un redémarrage rapide semble avoir résolu le problème. Peut-être causé par certaines mises à jour que j'ai faites il y a longtemps
John Doucette
6
Changer la variable DISPLAY de ": 0.0" à "localhost: 0.0" semble avoir fait l'affaire pour moi, du moins en se connectant de Cygwin à Linux.
M0j0
FWIW, je devais courir startxwin(après apt-cyg install xinit) à partir de l' cygwinhôte parce que je connectais Windows local à unix distant
Jonathan
40

J'ai eu le même problème avec Cygwin et Xming, connexion à un serveur Linux distant.

Ma variable $ DISPLAY était simplement ": 0.0" dans Cygwin, et bien que cela fonctionne localement, cela ne fonctionnait pas avec la commande ssh distante.

Changer la variable en "localhost: 0.0" a résolu le problème.

export DISPLAY=localhost:0.0

Une fois que j'ai fait cela, ma commande a fonctionné:

ssh -Yf user@host gvim somefile.c
m0j0
la source
5
C'était le problème pour moi même en utilisant Windows Services for Linux.
Lapo
1
Sur quel serveur avez-vous exécuté la export ...commande? 1) machine locale 2) serveur
abalter
1
@abalter Cela a fonctionné pour moi de le faire fonctionner sur la machine locale
tralston le
3
J'ai passé 2 heures à résoudre le problème avec Cygwin ssh + VcXsrv parce que je le définissais DISPLAY=:0 ssh -Y $host. Le changer pour DISPLAY=localhost:0résoudre le problème comme par magie.
Gavenkoa
1
Excellente réponse, toujours utile d'exécuter le sous-système ubuntu dans Windows
Tom Swifty
6

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 DISPLAYvariable 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.1sur 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 DISPLAYvariable 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. sshdest 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' ENOENTerreur.

Dans de tels cas, changer votre DISPLAYvariable pour utiliser la syntaxe TCP au lieu de la :0.0syntaxe 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).

init_js
la source
3

Si votre hôte d’affichage est macOS , assurez-vous que XQuartz est en cours d’exécution.

Ce message d'erreur vous indique que le tunnel ssh fonctionne mais ne sait pas comment vous connecter au serveur X situé de votre côté du tunnel .

Dans le bon vieux temps, Mac OS X démarrait XQuartz pour vous, mais nous avons apparemment abandonné cette jolie petite fonctionnalité de la version macOS du terminal.

softweyr
la source
suivi: Invalid MIT-MAGIC-COOKIE-1 keyxterm Xt error: Can't open display: localhost:10.0signifiait "vous devez sortir et SSH revenir après avoir démarré XQuartz" FWIW ...
rogerdpack
1

Je viens d'avoir le même problème. Le problème est que vous obtenez l'erreur «no-such-file» sur la machine distante , mais en réalité, ce fichier est manquant sur la machine (d'affichage) locale .

Juste pour voir ce qui se passerait, j'ai créé manuellement le fichier manquant (fifo, en fait) sur la machine d'affichage, comme ceci:

mkfifo /tmp/.X11-unix/X0

Puis ssh'ed dans la machine distante à nouveau, et voilà, X11 connecté bien.

Je ne sais pas si cela est pertinent ou non, mais ma machine d'affichage n'est pas Linux, c'est Windows avec cygwin et VcXsrv. (La machine distante est Linux)

Smendola
la source
4
/tmp/.X11-unix/X0est une socket de domaine unix, pas une FIFO
Samveen
0

J'ai rencontré ce problème en utilisant le sous-système Windows pour Linux . Le problème est que je n'avais pas d'interface graphique installée sur le client, car je suppose que, puisque c'est une machine Windows, j'ai une interface graphique.

Pour tester si vous avez une interface graphique, exécutez-le xclocksur le client. Si vous obtenez l'erreur, Error: Can't open display: :0vous devez installer un programme graphique pour Windows. J'ai utilisé Xserver .

Une fois que vous avez une interface graphique installée, essayez les commandes suivantes:

export DISPLAY=:0
xclock

Si une horloge arrive, alors le succès!

Maintenant, essayez ssh'ing dans le serveur, puis en cours d'exécution xclock. Avez-vous toujours reçu les messages d'erreur connect /tmp/.X11-unix/X0: Aucun fichier ou répertoire de ce type Erreur: Impossible d'ouvrir display: localhost: 10.0 ? En effet, le serveur tente de se connecter à lui-même pour afficher l'interface graphique. Au lieu de cela, vous voulez que la variable DISPLAY soit définie sur une adresse où le serveur peut obtenir votre ordinateur. Donc, si c'est sur un réseau local, entrez simplement le nom de votre ordinateur. Si vous vous connectez à un serveur sur le réseau étendu, vous devez spécifier l'adresse IP externe de votre routeur et transférer le port approprié.

LAN: export DISPLAY=ComputerName:0
WAN:export DISPLAY=257.257.257.257:0

Jack Cole
la source
"X forwarding" signifie "tunnellise le protocole X des applications exécutées sur la machine distante (le serveur, dans votre cas) vers la machine locale (le client, dans votre cas)", vous devez donc bien sûr exécuter un serveur X (et non "tout programme d'interface graphique") sur la machine locale. Windows en lui-même ne comprend pas le protocole X, même si "vous avez une interface graphique".
Dirkt
-2

Si cela fonctionnait bien et cessait de fonctionner sans raison appropriée, il pourrait probablement s'agir d'une instance X non contrôlée s'exécutant en arrière-plan. S'il vous plaît fermez cela en utilisant le gestionnaire de tâches.

Jerin
la source