Відкрийте вікно на віддаленому дисплеї X (чому "Не вдається відкрити дисплей")?


81

Одного разу,

DISPLAY=:0.0 totem /path/to/movie.avi

після того, як ssh 'ing у мій робочий стіл з мого ноутбука спричинить гру тотему movie.aviна моєму робочому столі.

Тепер це дає помилку:

No protocol specified
Cannot open display:

Я перевстановив Debian стиснення, коли він став стабільним на обох комп'ютерах, і, мабуть, я зламав конфігурацію.

Я поглянув на це, і не можу за все життя зрозуміти, що я повинен робити.

(VLC має інтерфейс HTTP, який працює, але це не так зручно, як ssh.)

Ця ж проблема виникає, коли я намагаюся запустити це з роботи з cron.


1
Чи показує ваш віддалений апарат файл .Xauthority? Інший очевидний питання - чи налаштовані ваш ssh-сервер і клієнт, щоб дозволити переадресацію X? Яку команду ви використовували для ssh?
Faheem Mitha

1
я намагаюся переслати X? Я хочу, щоб команда виконувалася на хості, а не на клієнті. Моя команда ssh - це просто ssh me @ host locate .Xauthority на хост-комп'ютері не відповідає жодним файлам.
Джастін Кресс

Як підказує Faheem, є гарна зміна, що ваша проблема пов’язана з тим, що ви totemне знайдете файл cookie X, і вам потрібно встановити XAUTHORITYвідповідне значення, тобто значення у вашому звичайному сеансі на робочому столі. Прочитайте Linux: wmctrl не може відкрити дисплей, коли сеанс розпочато через ssh + екран для деякого фону; також див. відповідну відповідь Як root можна запустити графічну програму на робочому столі інших користувачів? .
Жиль

1
добре, фізично сидячи за комп’ютером і набираючи ехо $ XAUTHORITY надає / var / run / gdm3 / auth-for-jcress-bb32gX / базу даних у сеансі ssh, набравши echo $ DISPLAY = (шлях вище) не вирішує проблему
Джастін Кресс

1
Я звинувачую GDM3, чому вони не могли б просто тримали $XAUTHORITYна ~/.Xauthorityяк всі чекають , що це буде.
Arrowmaster

Відповіді:


78

(Адаптовано з Linux: wmctrl не може відкрити дисплей, коли сеанс розпочато через екран ssh + )

ДИСПЛЕЙ та АВТОРІЯ

Програмі X потрібні два фрагменти інформації для підключення до дисплея X.

  • Потрібна адреса дисплея, яка зазвичай відбувається :0під час локального входу або :10, :11тощо, коли ви віддалено входите в систему (але число може змінюватися залежно від кількості активних підключень X). Адреса дисплея зазвичай вказується в DISPLAYзмінній середовища.

  • Для відображення потрібен пароль. X паролі відображення називаються магічними файлами cookie . Чарівні файли cookie не вказуються безпосередньо: вони завжди зберігаються у файлах X-авторитету, що представляють собою сукупність записів форми "display :42has cookie 123456". Файл повноважень X зазвичай вказується в XAUTHORITYзмінній оточення. Якщо $XAUTHORITYне встановлено, програми використовують ~/.Xauthority.

Ви намагаєтесь діяти у вікнах, які відображаються на вашому робочому столі. Якщо ви єдина людина, яка використовує ваш настільний апарат, велика ймовірність, що ім'я відображається :0. Визначити розташування файлу повноважень X важче, тому що з gdm, встановленим під Debian стисканням або Ubuntu 10.04, він знаходиться у файлі з випадково генерованим іменем. (Ви раніше не мали жодних проблем, оскільки попередні версії gdm використовували налаштування за замовчуванням, тобто файли cookie, що зберігаються в ~/.Xauthority.)

Отримання значень змінних

Ось кілька способів отримання значень DISPLAYта XAUTHORITY:

  • Ви можете систематично запускати сеанс на екрані зі свого робочого столу, можливо, автоматично у своїх скриптах для входу (з ~/.profile; але робити це лише у тому випадку, якщо вхід під X: тестувати, якщо DISPLAYвстановлено значення, що починається з :(що повинно охоплювати всі випадки, які ви ймовірно) зустріти)). В ~/.profile:

    case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    

    Потім на сеансі ssh:

    screen -d -r local
    
  • Ви також можете зберегти значення DISPLAYта XAUTHORITYу файл та згадати ці значення. В ~/.profile:

    case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    

    На сеансі ssh:

    . ~/.local-display-setup.sh
    screen
    
  • Ви могли виявити значення DISPLAYта XAUTHORITYз запущеного процесу. Це важче автоматизувати. Ви повинні з'ясувати PID процесу, підключеного до дисплея, над яким потрібно працювати, а потім отримати змінні середовища з /proc/$pid/environ( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')¹).

Копіювання файлів cookie

Інший підхід (за пропозицією Arrowmaster ) полягає в тому, щоб не намагатися отримати значення $XAUTHORITYв сесії ssh, а натомість змусити X-сеанс скопіювати файли cookie в ~/.Xauthority. Оскільки файли cookie створюються кожного разу при вході в систему, це не проблема, якщо ви зберігаєте застарілі значення ~/.Xauthority.

Проблема безпеки може виникнути, якщо ваш домашній каталог доступний через NFS або іншу мережеву файлову систему, яка дозволяє віддаленим адміністраторам переглядати його вміст. Їм все одно потрібно буде якось підключитися до вашої машини, якщо ви не ввімкнули X TCP-з’єднання (Debian вимкнено їх за умовчанням). Тож для більшості людей це або не застосовується (немає NFS), або не є проблемою (відсутність X TCP-з'єднань).

Щоб скопіювати файли cookie під час входу в сеанс X на робочому столі, додайте наступні рядки до ~/.xprofileабо ~/.profile(або до іншого сценарію, який читається під час входу):

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

This У принципі цього не вистачає належного котирування, але в цьому конкретному екземплярі $DISPLAYі $XAUTHORITYне міститиме жодного метахарактера оболонки.


2
Одним із способів автоматизації цього є створення, ~/.xprofileяке слід запускати лише під час входу в систему X, а також створювати / оновлювати ~/.Xauthorityйого правильною інформацією. Чи вистачило б символічного посилання?
Arrowmaster

@Arrowmaster: Це гарна пропозиція. Я не думав про це. Він не працюватиме у всіх випадках, наприклад, якщо ви увійдете в більш ніж один X сеанс (на різних терміналах, з vnc, ...), але це просто, і це досить добре для типового використання. Символічне посилання - найкращий спосіб. Хм, насправді є кращий, простий спосіб: ви можете скопіювати інформацію в ~/.Xauthority.
Жиль

1
Буде чи покласти що - щось подібне xauth extract - $DISPLAY | xauth -f "$HOME/.Xauthority" merge -в ~/.xprofileрішенні випадку множинного $ дисплея?
Arrowmaster

@Arrowmaster: Яку проблему ви бачите з кількома екранами? Хоча ваш код в принципі може бути трохи чистішим, оскільки ви лише видобуваєте інформацію про цікавий дисплей, я не бачу нічого поганого в простому злитті у випадку запитувача або взагалі за дуже незвичних обставин.
Жиль

1
Читання навколишнього середовища із існуючого процесу, підключеного до дисплея, несподівано, як це приємно зле. Я схвалюю від усієї душі. Unix.SE для цього потребує значка Evil Genius ™.
дероберт

19

Я вирішив це питання, додавши

xhost +si:localuser:$USER

до ~/.xprofile. Я не знаю, чи це взагалі безпечно (мені б дуже цікаво почути, що думають більш обізнані люди), але я здогадуюсь, що це набагато краще, ніж вимкнути контроль доступу (з xhost +), як це зазвичай пропонується, коли ви Google для цієї проблеми.


1
localuserІнтерпретовані сервером адреси є повністю захищеними. Debian навіть робить це за замовчуванням як частина процесу входу (в /etc/X11/Xsession.d/35x11-common_xhost-local). Докладніші відомості див. На сторінці користувача Xsecurity .
Сем Морріс

Якщо ви користуєтесь локальною мережею, xhost +напевно, у більшості випадків достатньо ...
Алексіс Вілке

Чи зможете ви пояснити, що означає ця команда?
alpha_989

@ alpha_989: Це означає "Надати доступ [+] до будь-якої локальної програми [localuser], яка працює як я [$ USER]." "Сі" - це просто клей (див. xhost(1)І Xsecurity(7)для документів). Сама по собі ця команда не допускає будь-якого виду віддаленого доступу або переадресації X11 (для якого зазвичай віддається перевага механізму "чарівного файлу cookie" xhost).
Кевін

7

Тобі потрібно export DISPLAY=:0.0


Ні. Unix не вимагає експорту, коли змінна записується в одному рядку. Ця змінна діє до закінчення рядка.
Алексіс Вілке

Дійсно, ви праві.
asoundmove

Ця відповідь явно неправильна і її слід видалити.
Пьотр Доброгост

Не знаю, що лише введення DISPLAY =: 0,0 встановить ім'я змінної. Дякую @asoundmove. Однак я думаю: 0,0 - це значення для змінної DISPLAY на дисплеї сервера. Якщо ви входите через Putty, змінна DISPLAY повинна становити 10 або вище. тож має бути DISPLAY =: 10
alpha_989

3

Працює для мене, debian wheezy -> ubuntu trusty.

Примітка. У цьому випадку на сервері не працює дисплей-менеджер, це віртуальна машина без голови без встановленої відеокарти або монітора.

bob@laptop:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
bob@laptop:~$ ssh -C -R 6000:127.0.0.1:6000 alice@server
X11 forwarding request failed on channel 0
alice@server:~$ export DISPLAY=:0.0
alice@server:~$ xterm

X-дисплей на ноутбуці показує вихід xterm, що працює на сервері.

Налагодження за допомогою:

bob@laptop:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
bob@laptop:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
alice@server:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
alice@server:~$ strace xterm

strace розлиє безліч деталей про те, що він робить, ви зможете здогадатися, де воно застряє - чекаючи на з'єднання чи що завгодно.

В одному рядку ..

ssh -C -R 6000:127.0.0.1:6000 alice@server "DISPLAY=:0.0 xterm"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.