ssh -X non funziona su Yosemite


16

Non è più possibile utilizzare X11 con ssh. XQuartz2.7.7 è installato. L'accesso con X11 tramite ssh fornisce gli avvisi

Avviso: impostazione di inoltro X11 non attendibile non riuscita: dati chiave xauth non generati Avviso: nessun dato xauth; utilizzando dati di autenticazione falsi per l'inoltro X11.

Nel mio sistema, echo $DISPLAY

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

Tuttavia, quando provo xauth generate $DISPLAY . trusted, ottengo l'errore

xauth: (argv): 1: nome visualizzato errato "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0 comando" in "add"

Qualche idea su come risolvere questo problema?


2
Il nome visualizzato come restituito da $DISPLAYè errato. Dovrebbe essere qualcosa del genere :0.0. Ti metti $DISPLAYdentro ~/.bash_profileo ~/.profilete stesso?
Jaume

2
Fa differenza quando usi l' -Yopzione invece di -X? Quale sistema operativo utilizza il tuo server? E: avere il $DISPLAYset su qualcosa /tmp/è perfettamente normale su un Mac.
Asmus,

@jaume Non imposto la mia variabile $ DISPLAY. Tuttavia, modificandolo manualmente sembra averlo corretto. Ora sono ancora sicuro di come sia finito.
stakSmashr,

Nel frattempo hai riavviato il tuo terminale? Questo mi ha aiutato con strani problemi di variabili d'ambiente in passato ...
Asmus,

@Asmus Avevo precedentemente riavviato Terminal e riavviato il computer più volte senza alcun risultato. Sto usando OS X 10.10.2. Tutto quello che ho fatto è stato fare qualcosa del genere DISPLAY=:0.0, e ha funzionato. Ho aggiunto questo nel mio .bash_profile
stakSmashr il

Risposte:


20

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:

inserisci qui la descrizione dell'immagine

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 DISPLAYvariabile è sbagliata". Ma non lo è.

A quanto pare, su OS X 10.10 Yosemite (e indietro a 10.8 Mountain Lion ) la DISPLAYvariabile memorizza un launchdpercorso socket:

/private/tmp/<socket name>

anziché il nome visualizzato familiare:

hostname:displaynumber.screennumber

(Ho aggiunto alcune informazioni sul hostname:displaynumber.screennumberformato alla fine di questa risposta.)

Ciò significa che xauthdeve saper gestire questa speciale incarnazione della DISPLAYvariabile, e come da Mavericks, ma il socket utilizzato in Yosemite ha un percorso diverso (più precisamente: /private/tmp/com.apple.launchd.XXXXinvece di /private/tmp/launch-XXXX) e si xauthrompe.

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 ~/.bashrceo 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:

inserisci qui la descrizione dell'immagine


Per i curiosi, tradizionalmente, il nome visualizzato del server X ha questa forma (da man Xsu 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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.