ssh -X nie działa na Yosemite

16

Nie można już używać X11 z ssh. Zainstaluj XQuartz2.7.7. Logowanie się do X11 przez ssh daje ostrzeżenia

Ostrzeżenie: niezaufana konfiguracja przekazywania X11 nie powiodła się: dane klucza xauth nie zostały wygenerowane Ostrzeżenie: Brak danych xauth; przy użyciu fałszywych danych uwierzytelniających do przekazywania X11.

W moim systemie echo $DISPLAYdaje

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

Jednak gdy próbuję, pojawia xauth generate $DISPLAY . trustedsię błąd

xauth: (argv): 1: zła nazwa wyświetlana "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0" w poleceniu "add"

Wszelkie pomysły, jak to naprawić?

stakSmashr
źródło
2
Nazwa wyświetlana w postaci zwróconej przez $DISPLAYjest niepoprawna. Tak powinno być :0.0. Czy można ustawić $DISPLAYw ~/.bash_profilelub ~/.profilesamemu?
jaume
2
Czy robi to różnicę, gdy używasz tej -Yopcji zamiast -X? Z jakiego systemu operacyjnego korzysta Twój serwer? I: posiadanie $DISPLAYzestawu do czegoś /tmp/jest zupełnie normalne na komputerze Mac.
Asmus
@jaume Nie ustawiam własnej zmiennej $ DISPLAY. Jednak ręczna zmiana wydaje się naprawić. Nadal jestem teraz pewien, jak to się skończyło.
stakSmashr
Czy w międzyczasie ponownie uruchomiłeś terminal? Pomogło mi to z dziwnymi problemami związanymi ze zmiennymi środowiskowymi w przeszłości…
Asmus,
@Asmus Wcześniej zrestartowałem Terminal, a także wielokrotnie uruchamiałem komputer bezskutecznie. Korzystam z systemu OS X 10.10.2. Wszystko, co zrobiłem, to zrobiłem coś takiego DISPLAY=:0.0i zadziałało. Dodałem to do mojego .bash_profile
stakSmashr

Odpowiedzi:

20

AKTUALIZACJA

Deweloper Jeremy Huddleston Sequoia ogłosił wczoraj, że ten problem został rozwiązany w XQuartz 2.7.8_beta2 :

XQuartz 2.7.8_beta2 jest dostępny do pobrania.

Pełny zestaw zmian można znaleźć na stronie http://xquartz.macosforge.org/trac/wiki/X112.7.8 , ale najważniejsze z nich to:

1) xauth teraz poprawnie analizuje uruchomioną przez Yosemite ścieżkę gniazda $ DISPLAY
2) libGL został zaktualizowany do wersji Mesa 10.4.4
3) Naprawiono różne exploity w xorg-server, freetype i libpng
4) Błąd uniemożliwiający automatyczne aktualizacje w niektórych przypadkach zostało naprawione

Raport o błędzie jest zamknięty i oznaczony jako naprawiony:

wprowadź opis zdjęcia tutaj

Jeśli nie możesz (lub nie chcesz) zainstalować wersji beta, nadal możesz skorzystać z obejścia, które wyjaśnię poniżej.


ODPOWIEDŹ

Analiza

(przewiń w dół do sekcji obejścia)

Moją pierwszą myślą było „ DISPLAYzmienna jest zła”. Ale nie jest.

Jak się okazuje, w OS X 10.10 Yosemite (iz powrotem do 10.8 Mountain Lion ) DISPLAYzmienna przechowuje launchdścieżkę gniazda:

/private/tmp/<socket name>

zamiast znanej nazwy wyświetlanej:

hostname:displaynumber.screennumber

(Dodałem trochę informacji o hostname:displaynumber.screennumberformacie na końcu tej odpowiedzi).

Oznacza to, że xauthmusi wiedzieć, jak sobie poradzić z tym specjalnym wcieleniem DISPLAYzmiennej, i tak jak w przypadku Mavericks, ale tak było, ale gniazdo używane w Yosemite ma inną ścieżkę (a dokładniej: /private/tmp/com.apple.launchd.XXXXzamiast /private/tmp/launch-XXXX) i xauthpęka.

Ten błąd został zgłoszony zespołowi XQuartz w dniu 18 listopada 2014 r. (3 miesiące temu) ( http://xquartz.macosforge.org/trac/ticket/2068 ):

Program xauth ma kod zarówno w gethost.c, jak i parsedpy.c, aby szukać nazw $ DISPLAY rozpoczynających się od „/ tmp / launch” i traktować to jako gniazdo lokalne. Jednak wydaje się, że lokalizacja się zmieniła, $ DISPLAY zaczyna się teraz od „/private/tmp/com.apple.launchd”, więc kod, który szuka / tmp / launch, nie łapie go. (...)

Zgodnie z opisem błędu ma zostać rozwiązany w XQuartz 2.7.8, który jest spóźniony o 4 miesiące (patrz strona planu projektu na stronie http://xquartz.macosforge.org/trac/roadmap ).

Łatka naprawiająca problem została zatwierdzona 31 grudnia 2014 r. W projekcie 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;
(...)

Pozostaje więc tylko kwestia czasu, zanim łatka znajdzie się w kolejnej wersji XQuartz.

Obejście

(testowany na OS X 10.10.2 Yosemite).

Dodaj:

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"

do ~/.bashrci albo zacząć nowe okno terminala lub źródło to ( . ~/.bashrc) w bieżącej sesji terminali.

Ten alias najpierw symbolizuje ścieżkę gniazda /private/tmp/launch-XXX(na przykład ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS), a następnie uruchamia ssh:

wprowadź opis zdjęcia tutaj


Dla ciekawskich, tradycyjnie nazwa wyświetlana serwera X ma następującą postać (z man XUbuntu): Nazwa wyświetlana serwera X ma następującą postać:

hostname:displaynumber.screennumber

gdzie:

   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
źródło