Откройте окно на удаленном X-дисплее (почему «Не удается открыть дисплей»)?

Давным-давно,

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

после того, как ssh на моем рабочем столе с моего ноутбука заставит тотем играть в movie.avi на моем рабочем столе.

Теперь он дает ошибку:

 No protocol specified Cannot open display: 

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

Я искал это, и не могу, чтобы жизнь меня определяла, что я должен делать.

(У VLC есть HTTP-интерфейс, который работает, но это не так удобно, как ssh.)

Эта же проблема возникает, когда я пытаюсь запустить ее из задания cron.

4 Solutions collect form web for “Откройте окно на удаленном X-дисплее (почему «Не удается открыть дисплей»)?”

(Адаптировано из Linux: wmctrl не может открыть отображение при запуске сеанса через экран ssh + )

ДИСПЛЕЙ И АВТОРИТЕТ

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

  • Ему нужен адрес дисплея, который обычно :0 когда вы вошли в систему локально или :10 :11 и т. Д., Когда вы вошли в систему удаленно (но число может меняться в зависимости от того, сколько X соединений активны ). Адрес дисплея обычно указывается в переменной окружения DISPLAY .

  • Ему нужен пароль для отображения. X-пароли имен называются волшебными куки-файлами . Магические файлы cookie не указываются напрямую: они всегда хранятся в файлах полномочий X, которые представляют собой коллекцию записей формы «display :42 имеет cookie 123456 ». Файл полномочий X обычно указывается в переменной среды XAUTHORITY . Если $XAUTHORITY не задано, программы используют ~/.Xauthority .

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

Получение значений переменных

Вот несколько способов получить значения DISPLAY и XAUTHORITY :

  • Вы можете систематически запускать сеанс экрана со своего рабочего стола, возможно, автоматически в своих сценариях входа (из ~/.profile ; но делайте это только при входе в систему под X: test, если для 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 

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

Я решил эту проблему, добавив

 xhost +si:localuser:$USER 

в ~/.xprofile . Я не знаю, полностью ли это безопасно (мне было бы очень интересно узнать, что думают более знающие люди), но я предполагаю, что это намного лучше, чем отключить контроль доступа (с помощью xhost + ), как это обычно бывает когда вы google для этой проблемы.

Вам нужно export DISPLAY=:0.0

Работает для меня, 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" 
  • Как отключить цифровую клавиатуру клавиатуры?
  • выход на проектор, так как разрешение ноутбука составляет 16: 9, а проектор ниже
  • Linux Mint 18: xmodmap и третий уровень не работают на firefox и texstudio
  • Как заставить Firefox почитать мою конфигурацию, чтобы отключить шрифт, намекающий на один шрифт?
  • Уменьшает ли окно использование свободной памяти?
  • Дим-экран перед заставкой
  • Как сделать снимок экрана полностью закрытого окна
  • Отображение доступа из сетевого пространства имен
  • Установите мета-ключ диспетчера окон в зависимости от подключенного Xserver
  • Установить Gvim после vim
  • Карта охватывает esc для RHEL 5?
  • Interesting Posts

    feh: одновременные режимы слайд-шоу и монтажа

    Объявить новый ключ-модификатор с помощью XKB

    Отменить завершение, но только завершение, в zsh

    CentOS: postqueue -p показывает сообщение, которое возвращается в очередь

    Что означает выражение Grep?

    Сценарий Bash для заполнения шаблона

    Запустите каждую программу как отдельный пользователь

    Переименуйте каталоги с "fname lname" на "lname, fname "

    Software Source перестает работать при изменении имени выпуска в файле lsb_release

    Как исправить мой дисплей после того, как Atom полностью сломал его?

    Как я могу использовать awk для создания переменной, которая используется в следующей строке?

    Почему не «cvs –help | меньше работы?

    404 Не Найдено. Файл существует (установлен)

    Как вырезать все до определенного слова / после поиска в скрипте

    RTL8723BE: Wi-Fi всегда отключается и не может подключиться снова и должен быть перезапущен для подключения

    Linux и Unix - лучшая ОС в мире.