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.xquartzgrees

Однак, коли я намагаюся xauth generate $DISPLAY . trusted, я отримую помилку

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

Будь-які ідеї, як це виправити?


2
Відображуване ім'я, яке повертається $DISPLAYпомилково. Це повинно бути щось на кшталт :0.0. Як встановити Ви $DISPLAYв ~/.bash_profileабо ~/.profileсамі?
jaume

2
Чи має значення зміна, коли ви використовуєте -Yопцію замість -X? Яку операційну систему використовує ваш сервер? І: мати свій $DISPLAYнабір на щось у вас /tmp/є цілком нормальним для Mac.
Асмус

@jaume Я не встановлюю власну змінну $ DISPLAY. Однак, вручну зміни, схоже, це виправили. Я досі впевнений, як це все було таким, яким воно було.
stakSmashr

Ви тим часом перезапустили свій Термінал? Це допомогло мені з дивними проблемами змінної середовища в минулому…
Асмус

@Asmus Я раніше перезапускав термінал, а також багато разів перезавантажував комп'ютер безрезультатно. Я використовував OS X 10.10.2. Все, що я робив, робив щось на кшталт DISPLAY=:0.0, і це працювало. Я додав це до свого .bash_profile
stakSmashr

Відповіді:


20

ОНОВЛЕННЯ

Розробник Jeremy Huddleston Sequoia вчора оголосив, що ця проблема вирішена в XQuartz 2.7.8_beta2 :

XQuartz 2.7.8_beta2 доступний для завантаження.

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

1) xauth тепер правильно аналізує
пуск сокета Yosemite запускається $ DISPLAY 2) libGL було оновлено до Mesa 10.4.4
3) Різні подвиги були виправлені в xorg-сервері, вільному форматі та libpng
4) Помилка, що запобігає автоматичному оновленню в деяких випадках, має були виправлені

Звіт про помилку закритий і позначений як виправлений:

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

Якщо ви не можете (або не хочете) встановити бета-версію, ви все одно можете скористатися способом, який я поясню нижче.


ВІДПОВІДЬ

Аналіз

(прокрутіть вниз до розділу обходу)

Першою моєю думкою було " DISPLAYзмінна неправильна". Але це не так.

Як виявляється, в OS X 10.10 Yosemite (і назад до 10.8 Mountain Lion ) DISPLAYзмінна зберігає launchdшлях socket:

/private/tmp/<socket name>

замість знайомого екранного імені:

hostname:displaynumber.screennumber

(Я додав деяку інформацію про hostname:displaynumber.screennumberформат наприкінці цієї відповіді.)

Це означає, що xauthтреба знати, як впоратися з цим особливим втіленням DISPLAYзмінної, і це стосується Mavericks, але сокет, який використовується в 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 / start", і трактувати це як локальний сокет. Однак місце розташування, схоже, змінилося, $ DISPLAY зараз починається з "/private/tmp/com.apple.launchd", тому код, який шукає / tmp / start, не вловлює його. (...)

Відповідно до опису помилок, це має бути вирішено в 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.