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.
strace -fo /tmp/trace ssh....
pour vérifier qu'il essaie de connecter ce socket de domaine Unix.Réponses:
Si vous avez un serveur X en cours d'exécution et que la
DISPLAY
variable 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 ,
sshd
sur RemoteMachine ensembles DISPLAY pourlocalhost: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/X0
dans le système de fichiers et/tmp/.X11-unix/X0
dans l’ espace de noms abstrait (généralement écrit@/tmp/.X11-unix/X0
). Depuisstrace
, 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-unix
sont supprimées,ssh
sans utiliser cet espace de noms abstrait.la source
lsof -p <PID of your local X server>
où vous devriez pouvoir trouver le/some/thing/Xn
fichier, celui-cin
étant votreDISPLAY
numéro.startxwin
(aprèsapt-cyg install xinit
) à partir de l'cygwin
hôte parce que je connectais Windows local à unix distantJ'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.
Une fois que j'ai fait cela, ma commande a fonctionné:
la source
export ...
commande? 1) machine locale 2) serveurDISPLAY=:0 ssh -Y $host
. Le changer pourDISPLAY=localhost:0
résoudre le problème comme par magie.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
, ouXMing
), il est plus probable que votre serveur X11 écoute sur un port TCP (tel que127.0.0.1
sur les ports TCP6000-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-à-direDISPLAY=: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 TCPlocalhost
, 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:Comme d'autres réponses, vous pouvez également exporter cette variable de manière interactive à partir de votre invite de commande:
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).la source
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.
la source
Invalid MIT-MAGIC-COOKIE-1 keyxterm Xt error: Can't open display: localhost:10.0
signifiait "vous devez sortir et SSH revenir après avoir démarré XQuartz" FWIW ...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:
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)
la source
/tmp/.X11-unix/X0
est une socket de domaine unix, pas une FIFOJ'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
xclock
sur le client. Si vous obtenez l'erreur,Error: Can't open display: :0
vous 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:
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
la source
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.
la source