it-swarm-ru.tech

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

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

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

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

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

No protocol specified
Cannot open display:

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

Я погуглил по этому поводу и не могу понять, что я должен делать.

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

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

83
justin cress

(Адаптировано из Linux: wmctrl не может открыть дисплей, когда сеанс инициируется через ssh + screen )

ОТОБРАЖЕНИЕ и ВЛАСТЬ

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

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

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

Вы пытаетесь действовать на окнах, которые отображаются на вашем рабочем столе. Если вы единственный, кто использует ваш настольный компьютер, вполне вероятно, что отображаемое имя - :0. Найти местоположение авторитетного файла X сложнее, потому что с gdm, настроенным в Debian squeeze или 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)=') ¹).

Копирование куки

Другой подход (следуя предложению Arrowmaster ) состоит в том, чтобы не пытаться получить значение $XAUTHORITY в сеансе ssh, а вместо этого заставить сеанс X копировать свои куки в ~/.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 не будут содержать метасимвол Shell.

81
Gilles 'SO- stop being evil'

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

xhost +si:localuser:$USER

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

20
edam

Тебе следует export DISPLAY=:0.0

7
asoundmove

У меня работает, debian wheezy -> Ubuntu Trusty.

Примечание: в этом случае на сервере не запущен менеджер дисплеев, это виртуальная машина без головы без подключенной графической карты или монитора.

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

X дисплей на ноутбуке показывает вывод xterm на сервере.

Отладка с использованием:

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

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

В одну строчку ..

ssh -C -R 6000:127.0.0.1:6000 [email protected] "DISPLAY=:0.0 xterm"
3
jmullee