ssh -X no funciona en Yosemite

Ya no se puede usar X11 con ssh. Tener XQuartz2.7.7 instalado. Iniciar sesión con X11 a través de ssh da las advertencias

Advertencia: la configuración de reenvío X11 no confiable falló: no se generaron los datos de la clave xauth Advertencia: No hay datos xauth; utilizando datos de autenticación falsos para el reenvío X11.

En mi propio sistema, echo $DISPLAYda

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

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

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

¿Alguna idea sobre cómo solucionar esto?

El nombre para mostrar que devuelve $DISPLAYes incorrecto. Debería ser algo como :0.0. ¿Te pones $DISPLAY~/.bash_profileo ~/.profiletú mismo?
¿Hace alguna diferencia cuando usas la -Yopción en lugar de -X? ¿Qué sistema operativo está utilizando su servidor? Y: tener su $DISPLAYconfiguración en algo /tmp/es perfectamente normal en una Mac.
@jaume No configuro mi propia variable $DISPLAY. Sin embargo, cambiarlo manualmente parece haberlo solucionado. Todavía estoy seguro de cómo terminó siendo lo que era.
¿Has reiniciado tu Terminal mientras tanto? Esto me ayudó con extraños problemas de variables de entorno en el pasado...
@Asmus Anteriormente había reiniciado Terminal y reiniciado la computadora muchas veces sin éxito. He estado usando OS X 10.10.2. Todo lo que hice fue hacer algo como DISPLAY=:0.0, y funcionó. He agregado esto en mi .bash_profile
No, por favor, no configure $DISPLAYmanualmente. Mire lo que man sshdice sobre el reenvío X11: The user should not manually set DISPLAY.¡Este es un riesgo potencial de seguridad!
¿Entonces, qué debería hacer? También parece que $DISPLAYla configuración en bash_profile no funciona. El síntoma es el siguiente: ssh con el original $DISPLAY=/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0inicia X11, pero da el error y el reenvío X11 no funciona. Salga de ssh y reinicie , vuelva $DISPLAYa :0.0intentarlo ssh -Xy funciona
La advertencia que Asmus menciona arriba ( The user should not manually set DISPLAYen man ssh) se aplica a la computadora a la que se conecta . La razón es que sshconfigurará la variable DISPLAY en la computadora remota para que el tráfico X11 pase por la sshconexión cifrada. Y man sshte advierte: ¡No lo modifiques! Pero debe configurar DISPLAY en su Mac para que funcione. Agregue esta línea a ~/.bash_profile: export DISPLAY=:0.0, pruébelo e informe.
Entonces, agregar esa línea ~/.bash_profiletodavía da el error de "configuración fallida". Sin embargo, como mencioné anteriormente, una cosa interesante es que si solo salgo igual DISPLAY, es decir. mantenerlo como /private/tmp/com.apple.launchd.crAjK9o5ak/org.macosforge.xquartz:0, hacer ssh -X, salir de ssh, luego ejecutar export DISPLAY=:0.0o simplemente DISPLAY=:0.0, X11 funciona con ssh y puedo ejecutar aplicaciones GUI desde el servidor
Después de agregar la export DISPLAY=:0.0línea ~/.bash_profile, debe abrir una nueva ventana de Terminal para que los cambios surtan efecto. Alternativamente, debe ejecutar . ~/.bash_profileen su shell actual para obtenerlo. ¿Hiciste eso? Si aún no funciona, puede agregar alias ssh="DISPLAY=:0.0; ssh"a ~/.bashrc.
Eso es exactamente lo que hice, pero los resultados son los descritos anteriormente. Parece que ssh necesita que la variable DISPLAY sea la original primero cuando se conecta, luego cambia al valor: 0.0 después...
¿Has probado el alias? ¿Inicias XQuartz como un elemento de inicio de sesión?
@stakSmashr Está bien...
@stakSmashr He agregado una respuesta con una descripción del problema, información sobre cuándo se puede resolver este error y dos soluciones, la que probó y otra.
@stakSmashr Finalmente encontré algo de tiempo para instalar XQuartz y probar la segunda solución. Funciona, agregué una captura de pantalla. También eliminé la primera solución. Es posible que desee darle una oportunidad.
gracias, pero no parece funcionar para mí, sigo recibiendo el error "$ xterm /private/tmp/com.apple.launchd.crAjK9o5ak/org.macosforge.xquartz: host desconocido. (Nodename ni servname proporcionado, o desconocido) xterm Xt error: No se puede abrir la pantalla: localhost:10.0"

Respuestas (1)

ACTUALIZAR

El desarrollador Jeremy Huddleston Sequoia anunció ayer que este problema está resuelto 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 los más notables son:

1) xauth ahora analiza correctamente la ruta del socket Yosemite launchd $DISPLAY
2) libGL se actualizó a Mesa 10.4.4
3) Se corrigieron varios exploits en xorg-server, freetype y libpng
4) Se ha producido un error que impide las actualizaciones automáticas en algunos casos ha sido arreglado

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

ingrese la descripción de la imagen aquí

Si no puede (o no quiere) instalar la versión beta, aún puede usar la solución alternativa que explico a continuación.


RESPUESTA

Análisis

(desplácese hacia abajo para ver la sección de soluciones)

Mi primer pensamiento fue "la DISPLAYvariable está mal". Pero no lo es.

Resulta que en OS X 10.10 Yosemite (y de vuelta a 10.8 Mountain Lion ) la DISPLAYvariable almacena una launchdruta de socket:

/private/tmp/<socket name>

en lugar del conocido nombre para mostrar:

hostname:displaynumber.screennumber

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

Esto significa que xauthtiene que saber cómo lidiar con esta encarnación especial de la DISPLAYvariable, y como en Mavericks, lo hizo, pero el zócalo utilizado en Yosemite tiene un camino diferente (más precisamente: /private/tmp/com.apple.launchd.XXXXen lugar de /private/tmp/launch-XXXX), y xauthse 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 de $DISPLAY que comiencen con "/tmp/launch" y para tratarlo 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 busca /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 la hoja de ruta del proyecto en http://xquartz.macosforge.org/trac/roadmap ).

El parche que soluciona el problema se envió 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;
(...)

Así que 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).

Agregar:

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"

e iniciar ~/.bashrcuna nueva ventana de Terminal o generarla ( . ~/.bashrc) en su sesión de Terminal actual.

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 comienza ssh:

ingrese la descripción de la imagen aquí


Para los curiosos, tradicionalmente, el nombre para mostrar del servidor X ha tenido esta forma (de man XUbuntu): El nombre para mostrar del servidor X tiene esta forma:

hostname:displaynumber.screennumber

donde:

   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.