ACTUALIZAR
El desarrollador Jeremy Huddleston Sequoia anunció ayer que este problema se resuelve en XQuartz 2.7.8_beta2 :
XQuartz 2.7.8_beta2 está disponible para descargar.
Puede ver http://xquartz.macosforge.org/trac/wiki/X112.7.8 para ver un conjunto completo de cambios, pero la mayoría de los notables son:
1) xauth ahora analiza correctamente la ruta del socket Yosemite launchd $ DISPLAY
2) libGL se ha actualizado a Mesa 10.4.4
3) Se corrigieron varias vulnerabilidades en xorg-server, freetype y libpng
4) Se ha producido un error que impide las actualizaciones automáticas en algunos casos sido arreglado
El informe de error está cerrado y marcado como fijo:
Si no puede (o no quiere) instalar la versión beta, aún puede usar la solución que explico a continuación.
RESPONDER
Análisis
(desplácese hacia abajo para la sección de solución)
Mi primer pensamiento fue "la DISPLAY
variable está mal". Pero no lo es.
Como resultado, en OS X 10.10 Yosemite (y de vuelta a 10.8 Mountain Lion ) la DISPLAY
variable almacena una launchd
ruta de socket:
/private/tmp/<socket name>
en lugar del familiar nombre para mostrar:
hostname:displaynumber.screennumber
(He agregado información sobre el hostname:displaynumber.screennumber
formato al final de esta respuesta).
Esto significa que xauth
tiene que saber cómo lidiar con esta encarnación especial de la DISPLAY
variable, y a partir de Mavericks, lo hizo, pero el socket utilizado en Yosemite tiene una ruta diferente (más precisamente: en /private/tmp/com.apple.launchd.XXXX
lugar de /private/tmp/launch-XXXX
) y se xauth
rompe.
Este error se informó al equipo de XQuartz el 18 de noviembre de 2014 (hace 3 meses) ( http://xquartz.macosforge.org/trac/ticket/2068 ):
El programa xauth tiene código tanto en gethost.c como en parsedpy.c para buscar nombres $ DISPLAY que comiencen con "/ tmp / launch", y para tratar eso como un socket local. Sin embargo, la ubicación parece haber cambiado, $ DISPLAY ahora comienza con "/private/tmp/com.apple.launchd", por lo que el código que está buscando / tmp / launch no lo detecta. (...)
De acuerdo con la descripción del error, debe resolverse en XQuartz 2.7.8, que tiene 4 meses de retraso (consulte la página de hoja de ruta del proyecto en http://xquartz.macosforge.org/trac/roadmap ).
El parche que soluciona el problema se confirmó el 31 de diciembre de 2014 al proyecto 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;
(...)
Entonces, es solo cuestión de tiempo hasta que este parche llegue a la próxima versión de XQuartz.
Solución alterna
(probado en OS X 10.10.2 Yosemite).
Añadir:
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
y, o bien iniciar una nueva ventana de terminal o de la fuente que ( . ~/.bashrc
) en la sesión actual de la terminal.
Este alias primero vincula simbólicamente la ruta del socket /private/tmp/launch-XXX
(por ejemplo ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS
) y luego comienza ssh
:
Para los curiosos, tradicionalmente, el nombre para mostrar del servidor X ha tenido esta forma (desde man X
Ubuntu): El nombre para mostrar del servidor X tiene esta forma:
hostname:displaynumber.screennumber
dónde:
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
es incorrecto. Debería ser algo así:0.0
. Cómo se establece$DISPLAY
en~/.bash_profile
o~/.profile
usted mismo?