AGGIORNARE
Lo sviluppatore Jeremy Huddleston Sequoia ha annunciato ieri che questo problema è stato risolto in XQuartz 2.7.8_beta2 :
XQuartz 2.7.8_beta2 è disponibile per il download.
Puoi vedere http://xquartz.macosforge.org/trac/wiki/X112.7.8 per una serie completa di modifiche, ma le più degne di nota sono:
1) xauth ora analizza correttamente lo Yosemite launchd $ DISPLAY socket path
2) libGL è stato aggiornato a Mesa 10.4.4
3) Vari exploit sono stati corretti in xorg-server, freetype e libpng
4) Un bug che impediva gli aggiornamenti automatici in alcuni casi ha stato risolto
La segnalazione di bug viene chiusa e contrassegnata come corretta:
Se non puoi (o non vuoi) installare la beta, puoi comunque usare la soluzione che spiego di seguito.
RISPOSTA
Analisi
(scorri verso il basso per la sezione alternativa)
Il mio primo pensiero è stato "la DISPLAY
variabile è sbagliata". Ma non lo è.
A quanto pare, su OS X 10.10 Yosemite (e indietro a 10.8 Mountain Lion ) la DISPLAY
variabile memorizza un launchd
percorso socket:
/private/tmp/<socket name>
anziché il nome visualizzato familiare:
hostname:displaynumber.screennumber
(Ho aggiunto alcune informazioni sul hostname:displaynumber.screennumber
formato alla fine di questa risposta.)
Ciò significa che xauth
deve saper gestire questa speciale incarnazione della DISPLAY
variabile, e come da Mavericks, ma il socket utilizzato in Yosemite ha un percorso diverso (più precisamente: /private/tmp/com.apple.launchd.XXXX
invece di /private/tmp/launch-XXXX
) e si xauth
rompe.
Questo errore è stato segnalato al team XQuartz il 18 novembre 2014 (3 mesi fa) ( http://xquartz.macosforge.org/trac/ticket/2068 ):
Il programma xauth ha un codice sia in gethost.c sia in parsedpy.c per cercare $ DISPLAY nomi che iniziano con "/ tmp / launch" e per trattarlo come un socket locale. Tuttavia, la posizione sembra essere cambiata, $ DISPLAY ora inizia con "/private/tmp/com.apple.launchd", quindi il codice che sta cercando / tmp / launch non lo rileva. (...)
Secondo la descrizione del bug, deve essere risolto in XQuartz 2.7.8, che è in ritardo di 4 mesi (vedere la pagina della roadmap del progetto su http://xquartz.macosforge.org/trac/roadmap ).
La patch che risolve il problema è stata assegnata il 31 dicembre 2014 al progetto 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;
(...)
Quindi è solo una questione di tempo fino a quando questa patch non si farà strada nella prossima versione di XQuartz.
Soluzione
(testato su OS X 10.10.2 Yosemite.)
Inserisci:
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"
a ~/.bashrc
eo avviare una nuova finestra Terminale o fonte di esso ( . ~/.bashrc
) nella corrente sessione di Terminal.
Questo alias collega prima il percorso del socket a /private/tmp/launch-XXX
(ad esempio ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS
) e quindi avvia ssh
:
Per i curiosi, tradizionalmente, il nome visualizzato del server X ha questa forma (da man X
su Ubuntu): Il nome visualizzato del server X ha questa forma:
hostname:displaynumber.screennumber
dove:
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
è errato. Dovrebbe essere qualcosa del genere:0.0
. Ti metti$DISPLAY
dentro~/.bash_profile
o~/.profile
te stesso?