(Адаптировано из Linux: wmctrl не может открыть дисплей, когда сеанс инициируется через ssh + screen )
ОТОБРАЖЕНИЕ и ВЛАСТЬ
Программе X требуется две части информации для подключения к дисплею X.
Требуется адрес дисплея, который обычно отображается :0
при локальном входе в систему или :10
, :11
и т. Д. При удаленном входе в систему (но число может меняться в зависимости от того, сколько активных X-соединений). Адрес дисплея обычно указывается в DISPLAY
переменной окружения.
Требуется пароль для отображения. Пароли X-дисплея называются волшебными куки . Магические куки не указываются напрямую: они всегда хранятся в X авторитетных файлах, которые представляют собой набор записей вида «на дисплее :42
есть куки 123456
». Файл полномочий X обычно указывается в XAUTHORITY
переменной среды. Если $XAUTHORITY
не установлено, программы используют ~/.Xauthority
.
Вы пытаетесь воздействовать на окна, которые отображаются на вашем рабочем столе. Если вы единственный пользователь, использующий ваш настольный компьютер, вполне вероятно, что отображаемое имя - :0
. Найти местоположение авторитетного файла X сложнее, потому что с gdm, настроенным в Debian squeeze или Ubuntu 10.04, он находится в файле со случайно сгенерированным именем. (У вас не было проблем раньше, потому что в более ранних версиях gdm использовались настройки по умолчанию, то есть файлы cookie, хранящиеся в ~/.Xauthority
.)
Получение значений переменных
Вот несколько способов получить значения DISPLAY
и XAUTHORITY
:
Вы можете систематически запускать сеанс экрана со своего рабочего стола, возможно, автоматически в сценариях входа в систему (из ~/.profile
; но делать это только при входе в систему под X: test if 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
не будет содержать какой - либо оболочку метасимвола.