ssh -X ne fonctionne pas sur Yosemite

16

Ne peut plus utiliser X11 avec ssh. Avoir XQuartz2.7.7 installé. La connexion avec X11 via ssh donne les avertissements

Avertissement: échec de la configuration du transfert X11 non approuvé: données de clé xauth non générées Avertissement: aucune donnée xauth; en utilisant de fausses données d'authentification pour le transfert X11.

Dans mon propre système, echo $DISPLAYdonne

/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0

Cependant, quand j'essaye xauth generate $DISPLAY . trusted, j'obtiens l'erreur

xauth: (argv): 1: nom d'affichage incorrect "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0" dans la commande "add"

Des idées sur la façon de résoudre ce problème?

stakSmashr
la source
2
Le nom d'affichage renvoyé par $DISPLAYest incorrect. Cela devrait ressembler à quelque chose :0.0. Établissez -vous $DISPLAYdans ~/.bash_profileou ~/.profilevous - même?
jaume
2
Cela fait-il une différence lorsque vous utilisez l' -Yoption au lieu de -X? Quel système d'exploitation votre serveur utilise-t-il? Et: avoir votre $DISPLAYset sur quelque chose /tmp/est parfaitement normal sur un Mac.
Asmus
@jaume Je ne mets pas ma propre variable $ DISPLAY. Cependant, le modifier manuellement semble l'avoir corrigé. Je suis toujours sûr de savoir comment cela a fini par être ce qu'il était.
stakSmashr
Avez-vous redémarré votre terminal entre-temps? Cela m'a aidé avec des problèmes de variables d'environnement étranges dans le passé ...
Asmus
@Asmus J'avais précédemment redémarré Terminal et redémarré l'ordinateur plusieurs fois en vain. J'utilise OS X 10.10.2. Tout ce que j'ai fait, c'est faire quelque chose comme ça DISPLAY=:0.0, et ça a marché. J'ai ajouté ceci dans mon .bash_profile
stakSmashr

Réponses:

20

MISE À JOUR

Le développeur Jeremy Huddleston Sequoia a annoncé hier que ce problème était résolu dans XQuartz 2.7.8_beta2 :

XQuartz 2.7.8_beta2 est disponible en téléchargement.

Vous pouvez voir http://xquartz.macosforge.org/trac/wiki/X112.7.8 pour un ensemble complet de changements, mais les plus notables sont:

1) xauth analyse désormais correctement le chemin de socket $ DISPLAY launchos de Yosemite
2) libGL a été mis à jour vers Mesa 10.4.4
3) Divers exploits ont été corrigés dans xorg-server, freetype et libpng
4) Un bogue empêchant les mises à jour automatiques dans certains cas a été réparé

Le rapport de bogue est fermé et marqué comme corrigé:

entrez la description de l'image ici

Si vous ne pouvez pas (ou ne voulez pas) installer la version bêta, vous pouvez toujours utiliser la solution de contournement que j'explique ci-dessous.


RÉPONDRE

Une analyse

(faites défiler vers le bas pour la section de contournement)

Ma première pensée a été "la DISPLAYvariable est fausse". Mais ce n'est pas.

Il s'avère que sur OS X 10.10 Yosemite (et de retour à 10.8 Mountain Lion ), la DISPLAYvariable stocke un launchdchemin de socket:

/private/tmp/<socket name>

au lieu du nom d'affichage familier:

hostname:displaynumber.screennumber

(J'ai ajouté quelques informations sur le hostname:displaynumber.screennumberformat à la fin de cette réponse.)

Cela signifie qu'il xauthfaut savoir comment gérer cette incarnation spéciale de la DISPLAYvariable, et comme pour Mavericks, il l'a fait, mais la prise utilisée dans Yosemite a un chemin différent (plus précisément: /private/tmp/com.apple.launchd.XXXXau lieu de /private/tmp/launch-XXXX), et se xauthcasse.

Ce bug a été signalé à l'équipe XQuartz le 18 novembre 2014 (il y a 3 mois) ( http://xquartz.macosforge.org/trac/ticket/2068 ):

Le programme xauth a du code à la fois dans gethost.c et parsedpy.c pour rechercher les noms $ DISPLAY qui commencent par "/ tmp / launch" et pour le traiter comme un socket local. Cependant, l'emplacement semble avoir changé, $ DISPLAY commence maintenant par "/private/tmp/com.apple.launchd", donc le code qui recherche / tmp / launch ne l'attrape pas. (...)

Selon la description du bogue, il doit être résolu dans XQuartz 2.7.8, avec 4 mois de retard (voir la page de la feuille de route du projet à http://xquartz.macosforge.org/trac/roadmap ).

Le correctif qui résout le problème a été attribué le 31 décembre 2014 au projet freedesktop.org ( http://cgit.freedesktop.org/xorg/app/xauth/commit/parsedpy.c?id=f990dd936b5fd1a40290bb88cde517a0ac38f823 ):

diff --git a/parsedpy.c b/parsedpy.c
index c591b77..7365224 100644
--- a/parsedpy.c
+++ b/parsedpy.c
@@ -42,6 +42,9 @@ in this Software without prior written authorization from The Open Group.
 #include <X11/Xauth.h>         /* for FamilyLocal */
 #include <X11/Xmu/SysUtil.h>

+#include <sys/stat.h>
+#include <sys/syslimits.h>
+
 #if defined(UNIXCONN) || defined(LOCALCONN)
 #define UNIX_CONNECTION "unix"
 #define UNIX_CONNECTION_LENGTH 4
@@ -158,8 +161,32 @@ parse_displayname (const char *displayname,

     if (!host) return False;

-    if(strncmp (host, "/tmp/launch", 11) == 0) {
-        family = FamilyLocal;
+    {
+        /*
+         * If using launchd socket, remove the screen number from the end
+         * of $DISPLAY and check if it is a path to a socket.
+         */
+        char path[PATH_MAX];
+        struct stat sbuf;
(...)

Ce n'est donc qu'une question de temps jusqu'à ce que ce correctif trouve son chemin dans la prochaine version de XQuartz.

solution de contournement

(testé sur OS X 10.10.2 Yosemite.)

Ajouter:

alias ssh="ln -fs $(echo $DISPLAY | sed 's:\(/private/tmp/com\.apple\.launchd\.[^/]*\)/.*:\1:') $(echo $DISPLAY | sed 's:/private/tmp/com\.apple\.launchd\.\([^/]*\)/.*:/private/tmp/launch-\1:'); ssh"

à ~/.bashrcet soit démarrer une nouvelle fenêtre du terminal ou de la source , il ( . ~/.bashrc) dans votre session Terminal en cours.

Cet alias crée d'abord un lien symbolique vers le chemin du socket /private/tmp/launch-XXX(par exemple ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS), puis démarre ssh:

entrez la description de l'image ici


Pour les curieux, traditionnellement, le nom d'affichage du serveur X a eu cette forme (à partir man Xd'Ubuntu): Le nom d'affichage du serveur X a cette forme:

hostname:displaynumber.screennumber

où:

   hostname
           The hostname specifies the name of the machine to which the display  is  physically
           connected.   If  the hostname is not given, the most efficient way of communicating
           to a server on the same machine will be used.

   displaynumber
           The phrase "display" is usually used to refer to  a  collection  of  monitors  that
           share a common set of input devices (keyboard, mouse, tablet, etc.).  Most worksta‐
           tions tend to only have one display.  Larger,  multi-user  systems,  however,  fre‐
           quently  have  several  displays so that more than one person can be doing graphics
           work at once.  To avoid confusion, each display on a machine is assigned a  display
           number (beginning at 0) when the X server for that display is started.  The display
           number must always be given in a display name.

   screennumber
           Some displays share their input devices among two or more monitors.  These  may  be
           configured as a single logical screen, which allows windows to move across screens,
           or as individual screens, each with their own set of windows.  If  configured  such
           that each monitor has its own set of windows, each screen is assigned a screen num‐
           ber (beginning at 0) when the X server for that display is started.  If the  screen
           number is not given, screen 0 will be used.
jaume
la source