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:
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 „ DISPLAY
zmienna jest zła”. Ale nie jest.
Jak się okazuje, w OS X 10.10 Yosemite (iz powrotem do 10.8 Mountain Lion ) DISPLAY
zmienna przechowuje launchd
ścieżkę gniazda:
/private/tmp/<socket name>
zamiast znanej nazwy wyświetlanej:
hostname:displaynumber.screennumber
(Dodałem trochę informacji o hostname:displaynumber.screennumber
formacie na końcu tej odpowiedzi).
Oznacza to, że xauth
musi wiedzieć, jak sobie poradzić z tym specjalnym wcieleniem DISPLAY
zmiennej, 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.XXXX
zamiast /private/tmp/launch-XXXX
) i xauth
pę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 ~/.bashrc
i 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
:
Dla ciekawskich, tradycyjnie nazwa wyświetlana serwera X ma następującą postać (z man X
Ubuntu): 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.
$DISPLAY
jest niepoprawna. Tak powinno być:0.0
. Czy można ustawić$DISPLAY
w~/.bash_profile
lub~/.profile
samemu?