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 :
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
:
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é.
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à.
0 votes
Avez-vous redémarré votre Terminal entre-temps? Cela m'a aidé avec des problèmes étranges de variables d'environnement dans le passé...
0 votes
@Asmus J'avais auparavant redémarré le Terminal ainsi que l'ordinateur de nombreuses fois sans succès. J'utilise OS X 10.10.2. Tout ce que j'ai fait était de faire quelque chose comme
DISPLAY=:0.0
, et ça a fonctionné. J'ai ajouté cela dans mon .bash_profile0 votes
Non, s'il vous plaît, ne définissez pas manuellement
$DISPLAY
. Regardez ce queman ssh
dit à propos du transfert X11 :L'utilisateur ne devrait pas définir manuellement DISPLAY.
C'est un risque potentiel pour la sécurité !0 votes
Ensuite, que dois-je faire? Il semble également que définir
$DISPLAY
dans le bash_profile ne fonctionne pas. Le symptôme est le suivant : ssh avec l'original$DISPLAY=/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0
démarre X11, mais il donne une erreur et le transfert X11 ne fonctionne pas. Quittez ssh et réinitialisez$DISPLAY
en:0.0
, réessayezssh -X
et ça fonctionne.0 votes
L'avertissement mentionné par Asmus ci-dessus (
L'utilisateur ne doit pas définir manuellement DISPLAY
dansman ssh
) s'applique à l'ordinateur auquel vous vous connectez. La raison en est quessh
définira la variable DISPLAY sur l'ordinateur distant pour vous permettre au trafic X11 de passer par la connexionssh
chiffrée. Etman ssh
vous avertit : ne le modifiez pas ! Mais vous devez définir DISPLAY sur votre Mac pour que cela fonctionne. Ajoutez cette ligne à~/.bash_profile
:export DISPLAY=:0.0
, testez et faites un retour.0 votes
Donc, en ajoutant cette ligne à
~/.bash_profile
donne toujours l'erreur "échec de la configuration". Cependant, comme je l'ai mentionné ci-dessus, une chose intéressante est que si je laisse simplementDISPLAY
tel quel, c'est-à-dire le garder comme/private/tmp/com.apple.launchd.crAjK9o5ak/org.macosforge.xquartz:0
, fairessh -X
, quitter ssh, puis exécuterexport DISPLAY=:0.0
ou simplementDISPLAY=:0.0
, X11 fonctionne avec ssh et je suis capable d'exécuter des applications GUI depuis le serveur.0 votes
Après avoir ajouté la ligne
export DISPLAY=:0.0
au fichier~/.bash_profile
, vous devez ouvrir une nouvelle fenêtre de terminal pour que les modifications prennent effet. Sinon, vous devez exécuter. ~/.bash_profile
dans votre shell actuel pour l'initialiser. L'avez-vous fait ? Si cela ne fonctionne toujours pas, vous pouvez ajouteralias ssh="DISPLAY=:0.0; ssh"
au fichier~/.bashrc
.0 votes
C'est exactement ce que j'ai fait, mais les résultats sont comme décrits ci-dessus. Il semble que ssh a besoin que la variable DISPLAY soit d'abord celle d'origine lors de la connexion, puis changée en la valeur :0.0 après...
0 votes
Avez-vous essayé l'alias? Démarrez-vous XQuartz en tant qu'élément de connexion?
0 votes
Laissez-nous continuer cette discussion en chat.
0 votes
@stakSmashr D'accord...
0 votes
@stakSmashr J'ai ajouté une réponse avec une description du problème, des informations sur quand ce bug pourrait être résolu et deux solutions de contournement, celle que vous avez testée et une autre.
0 votes
@stakSmashr J'ai enfin trouvé un peu de temps pour installer XQuartz et tester la deuxième solution de contournement. Ça marche, j'ai ajouté une capture d'écran. J'ai également supprimé la première solution de contournement. Tu devrais essayer.
0 votes
Merci, mais cela n'a pas semblé fonctionner pour moi, j'obtiens toujours l'erreur "$ xterm /private/tmp/com.apple.launchd.crAjK9o5ak/org.macosforge.xquartz: hôte inconnu. (nom d'hôte ou service inconnu) xterm Xt erreur: Impossible d'ouvrir l'affichage: localhost:10.0"