SSH-X не работает на Yosemite

16

Больше не могу использовать X11 с ssh. Установлен XQuartz2.7.7. Вход с X11 через ssh выдает предупреждения

Предупреждение: не удалось установить ненадежную пересылку X11: данные ключа xauth не сгенерированы Предупреждение: данные xauth отсутствуют; используя поддельные данные аутентификации для пересылки X11.

В моей собственной системе echo $DISPLAYдает

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

Однако, когда я пытаюсь xauth generate $DISPLAY . trusted, я получаю ошибку

xauth: (argv): 1: неверное отображаемое имя "/private/tmp/com.apple.launchd.GuewxwWwKS/org.macosforge.xquartz:0" в команде "добавить"

Есть идеи как это исправить?

stakSmashr
источник
2
Отображаемое имя, возвращаемое $DISPLAYневерно. Это должно быть что-то вроде :0.0. Как установить Вы $DISPLAYв ~/.bash_profileили ~/.profileсами?
Jaume
2
Имеет ли значение, когда вы используете -Yопцию вместо -X? Какую операционную систему использует ваш сервер? И еще: на Mac абсолютно нормально $DISPLAYнастроиться на что-то /tmp/.
Асмус
@jaume Я не устанавливаю свою собственную переменную $ DISPLAY. Тем не менее, изменение вручную, кажется, исправило это. Я до сих пор уверен, как все закончилось тем, что было.
stakSmashr
Вы перезапустили свой Терминал в это время? Это помогло мне с странными проблемами с переменными окружения в прошлом ...
Asmus
@ Asmus Я ранее перезагружал терминал, а также много раз перезагружал компьютер, но безрезультатно. Я использую OS X 10.10.2. Все, что я сделал, это сделал что-то вроде DISPLAY=:0.0, и это сработало. Я добавил это в свой .bash_profile
stakSmashr

Ответы:

20

ОБНОВИТЬ

Разработчик Джереми Хаддлстон Секвойя вчера объявил, что эта проблема решена в XQuartz 2.7.8_beta2 :

XQuartz 2.7.8_beta2 доступен для скачивания.

Вы можете посмотреть http://xquartz.macosforge.org/trac/wiki/X112.7.8 полный набор изменений, но наиболее заслуживающими внимания являются:

1) xauth теперь правильно анализирует путь к сокету Yosemite launchd $ DISPLAY
2) libGL обновлен до Mesa 10.4.4
3) исправлены различные эксплойты в xorg-server, freetype и libpng
4) ошибка, препятствующая автоматическому обновлению в некоторых случаях, имеет был исправлен

Отчет об ошибке закрыт и помечен как исправленный:

введите описание изображения здесь

Если вы не можете (или не хотите) устанавливать бета-версию, вы все равно можете использовать обходной путь, который я объясню ниже.


ОТВЕТ

Анализ

(прокрутите вниз для обходного раздела)

Моей первой мыслью было « DISPLAYпеременная неверна». Но это не так.

Как выясняется, в OS X 10.10 Yosemite (и обратно в 10.8 Mountain Lion ) DISPLAYпеременная хранит launchdпуть к сокету:

/private/tmp/<socket name>

вместо привычного отображаемого имени:

hostname:displaynumber.screennumber

(Я добавил некоторую информацию о hostname:displaynumber.screennumberформате в конце этого ответа.)

Это означает, что xauthон должен знать, как обращаться с этим специальным воплощением DISPLAYпеременной, и как и Маверикс, он это сделал, но сокет, используемый в Yosemite, имеет другой путь (точнее: /private/tmp/com.apple.launchd.XXXXвместо /private/tmp/launch-XXXX) и xauthразрывается.

Об этой ошибке сообщили команде XQuartz 18 ноября 2014 года (3 месяца назад) ( http://xquartz.macosforge.org/trac/ticket/2068 ):

Программа xauth имеет код как в gethost.c, так и в parsedpy.c для поиска имен $ DISPLAY, которые начинаются с «/ tmp / launch», и для обработки этого как локального сокета. Однако, похоже, что местоположение изменилось, $ DISPLAY теперь начинается с "/private/tmp/com.apple.launchd", поэтому код, который ищет / tmp / launch, не перехватывает его. (...)

В соответствии с описанием ошибки, она должна быть решена в XQuartz 2.7.8, который опаздывает на 4 месяца (см. Страницу плана проекта на http://xquartz.macosforge.org/trac/roadmap ).

Патч, исправляющий проблему, был зафиксирован 31 декабря 2014 года в проекте 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;
(...)

Так что это всего лишь вопрос времени, пока этот патч не войдет в следующую версию XQuartz.

Временное решение

(проверено на OS X 10.10.2 Yosemite.)

Добавлять:

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"

чтобы ~/.bashrcи либо начать новое окно терминала или источник его ( . ~/.bashrc) в текущем терминале сессии.

Этот псевдоним сначала символически связывает путь сокета /private/tmp/launch-XXX(например ln -fs /private/tmp/com.apple.launchd.GuewxwWwKS /private/tmp/launch-GuewxwWwKS), а затем запускается ssh:

введите описание изображения здесь


Для любопытных, традиционно, отображаемое имя X-сервера имеет такую ​​форму (из man XUbuntu): Отображаемое имя X-сервера имеет такую ​​форму:

hostname:displaynumber.screennumber

где:

   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.
Жауме
источник