ssh -X funktioniert nicht mit Yosemite

16

Kann X11 nicht mehr mit ssh verwenden. Habe XQuartz2.7.7 installiert. Wenn Sie sich mit X11 über ssh anmelden, erhalten Sie die Warnungen

Warnung: Setup der nicht vertrauenswürdigen X11-Weiterleitung fehlgeschlagen: xauth-Schlüsseldaten nicht generiert Warnung: Keine xauth-Daten; Verwenden gefälschter Authentifizierungsdaten für die X11-Weiterleitung.

In meinem eigenen System echo $DISPLAYgibt

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

Wenn ich es jedoch versuche xauth generate $DISPLAY . trusted, erhalte ich den Fehler

xauth: (argv): 1: falscher Anzeigename "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0" im Befehl "add"

Irgendwelche Ideen, wie man das behebt?

stakSmashr
quelle
2
Der von zurückgegebene Anzeigename $DISPLAYist falsch. Es sollte so etwas sein :0.0. Haben Sie setzen $DISPLAYin ~/.bash_profileoder ~/.profilesich selbst?
Jaume
2
Macht es einen Unterschied, wenn Sie die -YOption anstelle von verwenden -X? Welches Betriebssystem verwendet Ihr Server? Und: Auf einem Mac ist es völlig normal, dass Sie $DISPLAYetwas eingestellt haben /tmp/.
Asmus
@jaume Ich habe keine eigene Variable für $ DISPLAY festgelegt. Das manuelle Ändern scheint es jedoch behoben zu haben. Ich bin mir immer noch sicher, wie es zu dem wurde, was es war.
stakSmashr
Haben Sie Ihr Terminal in der Zwischenzeit neu gestartet? Dies hat mir in der Vergangenheit bei seltsamen Problemen mit Umgebungsvariablen geholfen…
Asmus
@Asmus Ich hatte zuvor Terminal neu gestartet und den Computer viele Male ohne Erfolg neu gestartet. Ich habe OS X 10.10.2 verwendet. Ich habe nur so etwas gemacht DISPLAY=:0.0, und es hat funktioniert. Ich habe dies in mein .bash_profile
stakSmashr 10.02.15

Antworten:

20

AKTUALISIEREN

Der Entwickler Jeremy Huddleston Sequoia gab gestern bekannt, dass dieses Problem in XQuartz 2.7.8_beta2 behoben ist :

XQuartz 2.7.8_beta2 steht zum Download zur Verfügung.

Eine vollständige Liste der Änderungen finden Sie unter http://xquartz.macosforge.org/trac/wiki/X112.7.8. Die wichtigsten sind jedoch:

1) xauth parst jetzt korrekt die launchd $ DISPLAY Buchse Pfad Yosemite
2) libGL zu Mesa aktualisiert wurde 10.4.4
3) Verschiedene Taten wurden in xorg-Server, Freetype fixiert und libpng
4) Ein Fehler verhindert automatische Updates in einigen Fällen hat wurde behoben

Der Fehlerbericht ist geschlossen und als behoben markiert:

Bildbeschreibung hier eingeben

Wenn Sie die Betaversion nicht installieren können (oder möchten), können Sie dennoch die unten beschriebene Problemumgehung verwenden.


ANTWORTEN

Analyse

(Scrollen Sie nach unten für den Workaround-Abschnitt)

Mein erster Gedanke war "die DISPLAYVariable ist falsch". Aber es ist nicht.

Wie sich herausstellt, speichert die Variable unter OS X 10.10 Yosemite (und zurück zu 10.8 Mountain Lion ) DISPLAYeinen launchdSocket-Pfad:

/private/tmp/<socket name>

anstelle des bekannten Anzeigenamens:

hostname:displaynumber.screennumber

(Ich habe hostname:displaynumber.screennumberam Ende dieser Antwort einige Informationen zum Format hinzugefügt .)

Das bedeutet, dass xauthman wissen muss, wie man mit dieser speziellen Inkarnation der DISPLAYVariablen umgeht, und wie bei Mavericks, aber der in Yosemite verwendete Socket hat einen anderen Pfad (genauer: /private/tmp/com.apple.launchd.XXXXstatt /private/tmp/launch-XXXX) und xauthbricht.

Dieser Fehler wurde dem XQuartz-Team am 18. November 2014 (vor 3 Monaten) gemeldet ( http://xquartz.macosforge.org/trac/ticket/2068 ):

Das Programm xauth enthält sowohl in gethost.c als auch in parsedpy.c Code, um nach $ DISPLAY-Namen zu suchen, die mit "/ tmp / launch" beginnen, und dies als lokalen Socket zu behandeln. Der Speicherort scheint sich jedoch geändert zu haben. $ DISPLAY beginnt jetzt mit "/private/tmp/com.apple.launchd", sodass der Code, der nach / tmp / launch sucht, ihn nicht erfasst. (...)

Laut Fehlerbeschreibung soll es in XQuartz 2.7.8 behoben werden, was 4 Monate zu spät ist (siehe die Projekt-Roadmap-Seite unter http://xquartz.macosforge.org/trac/roadmap ).

Der Patch zur Behebung des Problems wurde am 31. Dezember 2014 für das Projekt freedesktop.org ( http://cgit.freedesktop.org/xorg/app/xauth/commit/parsedpy.c?id=f990dd936b5fd1a40290bb88cde517a0ac38f823 ) bereitgestellt :

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

Es ist also nur eine Frage der Zeit, bis dieser Patch seinen Weg in die nächste Version von XQuartz findet.

Umgehung

(Getestet unter OS X 10.10.2 Yosemite.)

Hinzufügen:

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"

Öffnen ~/.bashrcund starten Sie entweder ein neues Terminalfenster oder geben Sie ihm ( . ~/.bashrc) in Ihrer aktuellen Terminal-Sitzung eine Quelle .

Dieser Alias ​​verknüpft zuerst den Socket-Pfad mit /private/tmp/launch-XXX(zum Beispiel ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS) und startet dann ssh:

Bildbeschreibung hier eingeben


Für die neugierigen, traditionell hat der Anzeigename des X-Servers diese Form (von man XUbuntu): Der Anzeigename des X-Servers hat diese Form:

hostname:displaynumber.screennumber

woher:

   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.
jaume
quelle