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é:
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 DISPLAY
variable 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 DISPLAY
variable stocke un launchd
chemin 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.screennumber
format à la fin de cette réponse.)
Cela signifie qu'il xauth
faut savoir comment gérer cette incarnation spéciale de la DISPLAY
variable, 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.XXXX
au lieu de /private/tmp/launch-XXXX
), et se xauth
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 $ 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"
à ~/.bashrc
et 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
:
Pour les curieux, traditionnellement, le nom d'affichage du serveur X a eu cette forme (à partir man X
d'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.
$DISPLAY
est incorrect. Cela devrait ressembler à quelque chose:0.0
. Établissez -vous$DISPLAY
dans~/.bash_profile
ou~/.profile
vous - même?