ssh -X no funciona en Yosemite

16

Ya no puedo usar X11 con ssh. Tener instalado XQuartz2.7.7. Al iniciar sesión con X11 a través de ssh se muestran las advertencias

  

Advertencia: error en la configuración del reenvío X11 no confiable: datos de clave xauth no generados   Advertencia: No hay datos de xauth; utilizando datos de autenticación falsos para el reenvío X11.

En mi propio sistema, echo $DISPLAY da

  

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

Sin embargo, cuando intento xauth generate $DISPLAY . trusted , aparece el error

  

xauth: (argv): 1: nombre de pantalla incorrecto "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0" en el comando "agregar"

¿Alguna idea sobre cómo solucionar esto?

    
pregunta stakSmashr 30.01.2015 - 02:51

1 respuesta

20

ACTUALIZAR

El desarrollador Jeremy Huddleston Sequoia anunció ayer que este problema se solucionó en < a href="http://xquartz.macosforge.org/downloads/SL/XQuartz-2.7.8_beta2.dmg"> XQuartz 2.7.8_beta2 :

  

XQuartz 2.7.8_beta2 está disponible para descargar.

     

Puede ver enlace para obtener un   conjunto completo de cambios, pero los más notables son:

     

1) xauth ahora analiza correctamente la ruta del socket $ DISPLAY de Yosemite launchd
  2) libGL ha sido actualizado a Mesa 10.4.4
  3) Se solucionaron varios exploits en xorg-server, freetype y libpng
  4) Se ha solucionado un error que impedía las actualizaciones automáticas en algunos casos

El informe de error está cerrado y marcado como corregido:

  

Sinopuedes(onoquieres)instalarlaversiónbeta,puedesseguirutilizandolasoluciónqueexplicoacontinuación.

RESPUESTA

Análisis

(desplácesehaciaabajoparaverlaseccióndesolución)

Miprimerpensamientofue"la variable DISPLAY es incorrecta". Pero no lo es.

Resulta que, en OS X 10.10 Yosemite (y de nuevo a 10.8 Mountain Lion ) el La variable DISPLAY almacena una ruta de socket launchd :

/private/tmp/<socket name>

en lugar del nombre de pantalla familiar:

hostname:displaynumber.screennumber

(He agregado alguna información sobre el formato hostname:displaynumber.screennumber al final de esta respuesta)

Esto significa que xauth debe saber cómo lidiar con esta encarnación especial de la variable DISPLAY , y a partir de Mavericks, lo hizo, pero el socket utilizado en Yosemite tiene una ruta diferente (más precisamente: /private/tmp/com.apple.launchd.XXXX en lugar de /private/tmp/launch-XXXX ) y xauth saltos.

Este error se informó al equipo de XQuartz el 18 de noviembre de 2014 (hace 3 meses) ( enlace ):

  

El programa xauth tiene código en gethost.c y parsedpy.c para buscar   para los nombres de $ DISPLAY que comienzan con "/ tmp / launch", y para tratar eso como   un zócalo local. Sin embargo, la ubicación parece haber cambiado, $ DISPLAY   ahora comienza con "/private/tmp/com.apple.launchd", entonces el código que es   Buscando / tmp / launch no lo atrapa. (...)

De acuerdo con la descripción del error, se resolverá en XQuartz 2.7.8, que se retrasará 4 meses (vea la página de la hoja de ruta del proyecto en enlace ).

El parche que soluciona el problema se envió el 31 de diciembre de 2014 al proyecto freedesktop.org ( enlace ):

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

Por lo tanto, es solo una cuestión de tiempo hasta que este parche encuentre su camino hacia la próxima versión de XQuartz.

Workaround

(probado en OS X 10.10.2 Yosemite.)

Añadir:

alias ssh="ln -fs $(echo $DISPLAY | sed 's:\(/private/tmp/com\.apple\.launchd\.[^/]*\)/.*::') $(echo $DISPLAY | sed 's:/private/tmp/com\.apple\.launchd\.\([^/]*\)/.*:/private/tmp/launch-:'); ssh"

a ~/.bashrc e inicie una nueva ventana de Terminal o fíjela ( . ~/.bashrc ) en su sesión actual de Terminal.

Este alias primero vincula la ruta del socket a /private/tmp/launch-XXX (por ejemplo, ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS ) y luego inicia ssh :

Paraloscuriosos,tradicionalmente,elnombreparamostrardelservidorXhatenidoestaforma(demanXenUbuntu):ElnombreparamostrardelservidorXtieneestaforma:

hostname:displaynumber.screennumber

donde:

hostnameThehostnamespecifiesthenameofthemachinetowhichthedisplayisphysicallyconnected.Ifthehostnameisnotgiven,themostefficientwayofcommunicatingtoaserveronthesamemachinewillbeused.displaynumberThephrase"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.
    
respondido por el jaume 12.02.2015 - 16:57

Lea otras preguntas en las etiquetas