16 votes

Ssh -X ne fonctionne pas sur Yosemite

Impossible d'utiliser X11 avec ssh. XQuartz2.7.7 est installé. Se connecter avec X11 via ssh donne les avertissements

Avertissement : configuration de transfert X11 non sécurisé a échoué : données de clé xauth non générées Avertissement : Pas de données xauth ; utilisation de fausses données d'authentification pour le transfert X11.

Sur mon propre système, echo $DISPLAY donne

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

Cependant, lorsque j'essaie xauth generate $DISPLAY . trusted, j'obtiens l'erreur

xauth: (argv):1: mauvais nom d'affichage "/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 ?

2 votes

Le nom d'affichage renvoyé par $DISPLAY est incorrect. Il devrait être quelque chose comme :0.0. Avez-vous défini $DISPLAY dans ~/.bash_profile ou ~/.profile vous-même?

2 votes

Est-ce que cela fait une différence lorsque vous utilisez l'option -Y au lieu de -X? Quel système d'exploitation utilise votre serveur? Et : avoir votre variable $DISPLAY définie sur quelque chose dans /tmp/ est parfaitement normal sur un Mac.

0 votes

@jaume Je ne définis pas ma propre variable $DISPLAY. Cependant, la modifier manuellement semble avoir résolu le problème. Je ne sais toujours pas comment elle en est arrivée là.

20voto

jaume Points 13186

MISE À JOUR

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

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

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

1) xauth analyse désormais correctement le chemin du socket $DISPLAY de launchd 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 bug empêchant les mises à jour automatiques dans certains cas a été corrigé

Le rapport de bug est fermé et marqué comme résolu :

entrer la description de l'image ici

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


RÉPONSE

Analyse

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

Ma première pensée était "la variable DISPLAY est incorrecte". Mais ce n'est pas le cas.

En fait, sur OS X 10.10 Yosemite (et jusqu'à 10.8 Mountain Lion), la variable DISPLAY stocke un chemin de socket de launchd:

/private/tmp/

au lieu du nom d'affichage familier :

nomhôte:numérodedisplay.numéroécran

(J'ai ajouté des informations sur le format nomhôte:numérodedisplay.numéroécran à la fin de cette réponse.)

Cela signifie que xauth doit savoir comment gérer cette incarnation spéciale de la variable DISPLAY, et à partir de Mavericks, c'était déjà le cas, mais le socket utilisé dans Yosemite a un chemin différent (plus précisément : /private/tmp/com.apple.launchd.XXXX au lieu de /private/tmp/launch-XXXX), et xauth se casse.

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 de $DISPLAY qui commencent par "/tmp/launch", et traiter cela comme un socket local. Cependant, l'emplacement semble avoir changé, $DISPLAY commence maintenant par "/private/tmp/com.apple.launchd", donc le code qui cherche /tmp/launch ne le détecte pas. (...)

Selon la description du bug, il devrait être résolu dans XQuartz 2.7.8, ce qui est 4 mois en retard (voir la page de planification du projet sur http://xquartz.macosforge.org/trac/roadmap).

Le correctif résolvant le problème a été commité 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          /* for FamilyLocal */
 #include 

+#include 
+#include 
+
 #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;
(...)

Il n'est donc qu'une question de temps avant que ce correctif soit intégré à la prochaine version de XQuartz.

Contournement

(testé sur OS X 10.10.2 Yosemite.)

Ajoutez :

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"

dans ~/.bashrc et commencez une nouvelle fenêtre Terminal ou sourcez-le (. ~/.bashrc) dans votre session Terminal actuelle.

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) et ensuite lance ssh :

entrer la description de l'image ici


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

nomdumachine:numérodedisplay.numéroécran

où :

   nomdumachine
           Le nom d'hôte spécifie le nom de la machine à laquelle l'affichage est physiquement connecté. Si le nom d'hôte n'est pas donné, le moyen le plus efficace de communiquer avec un serveur sur la même machine sera utilisé.

   numérodedisplay
           Le terme "affichage" est généralement utilisé pour désigner une collection de moniteurs partageant un ensemble commun de périphériques d'entrée (clavier, souris, tablette, etc.). La plupart des postes de travail ont tendance à n'avoir qu'un seul affichage. Cependant, les systèmes plus grands et multi-utilisateurs ont fréquemment plusieurs affichages de sorte que plusieurs personnes puissent travailler sur des graphismes en même temps. Pour éviter toute confusion, chaque affichage sur une machine se voit attribuer un numéro d'affichage (commençant à 0) lorsque le serveur X pour cet affichage est lancé. Le numéro d'affichage doit toujours être donné dans un nom d'affichage.

   numéroécran
           Certains affichages partagent leurs périphériques d'entrée entre deux ou plusieurs moniteurs. Ils peuvent être configurés comme un seul écran logique, permettant aux fenêtres de se déplacer d'un écran à l'autre, ou comme des écrans individuels, chacun avec son propre ensemble de fenêtres. Si configuré de telle sorte que chaque moniteur ait son propre ensemble de fenêtres, chaque écran se voit attribuer un numéro d'écran (commençant à 0) lorsque le serveur X pour cet affichage est démarré. Si le numéro d'écran n'est pas donné, l'écran 0 sera utilisé.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X