ОТОБРАЖЕНИЕ и ВЛАСТЬ
X-программе требуется две части информации для подключения к X-дисплею. (Обратите внимание, что wmctrl
- это программа X, даже если она обращается к окнам других процессов, а не создает свои собственные.)
Ему нужен адрес дисплея, который обычно равен :0
при локальном входе в систему или :10
, :11
и т.д. При удаленном входе в систему (но число может меняться в зависимости от количества активных подключений X). ). Адрес дисплея обычно указывается в переменной окружения DISPLAY
.
Требуется пароль для отображения. Пароли X-дисплея называются волшебными куки . Волшебные куки не указываются напрямую: они всегда хранятся в X авторитетных файлах, которые представляют собой набор записей вида «display :42
has cookie 123456
». Файл полномочий X обычно указывается в переменной среды XAUTHORITY
. Если $XAUTHORITY
не установлено, программы используют ~/.Xauthority
.
В сеансе экрана переменные среды определяются при запуске сеанса, если вы не изменили их явно в какой-то момент. Поэтому, если вы запускаете сеанс экрана локально на настольном компьютере, а затем подключаетесь к нему удаленно, $DISPLAY
и $XAUTHORITY
по-прежнему указывают на ваш настольный компьютер. Но если вы начнете сеанс экрана с ssh-соединения с какого-либо компьютера C на настольный компьютер, переменные не будут установлены. (Они будут указывать на C, если у вас есть X-сервер на C и вы включили переадресацию X через сеанс ssh.)
Получение значений переменных
Насколько я понимаю, вы пытаетесь действовать на окнах, которые отображаются на вашем рабочем столе. Если вы единственный пользователь, использующий ваш настольный компьютер, вполне вероятно, что отображаемое имя :0
. Найти местоположение авторитетного файла X сложнее (при настройке по умолчанию в Ubuntu он находится в файле со случайно сгенерированным именем).
Вот несколько способов получить значения DISPLAY
и XAUTHORITY
:
Простое решение - всегда запускать сеанс экрана с рабочего стола, возможно, автоматически в сценариях входа в систему (из ~/.profile
; но делать это только при входе в систему под X: проверьте, если для DISPLAY
установлено значение, начинающееся с :
(that должны охватывать все случаи, с которыми вы можете столкнуться)). В ~/.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-coordinates.sh;;
esac
В сеансе SSH:
. ~/.local-display-coordinates.sh
screen
Вы можете обнаружить значения DISPLAY
и XAUTHORITY
из запущенного процесса. Это сложнее автоматизировать. Вы должны выяснить PID процесса, который подключен к дисплею, с которым вы хотите работать, а затем получить переменные окружения из /proc/$pid/environ
(eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹).
Копирование куки
Другой подход (следуя предложению Arrowmaster, заключается в том, чтобы не пытаться получить значение $XAUTHORITY
в сеансе ssh, а вместо этого заставить сеанс X копировать свои файлы cookie в ~/.Xauthority
. Поскольку файлы cookie генерируются при каждом входе в систему, это не проблема, если вы сохраняете устаревшие значения в ~/.Xauthority
.
Может быть проблема безопасности, если ваш домашний каталог доступен через NFS или другую сетевую файловую систему, что позволяет удаленным администраторам просматривать его содержимое. Им все равно нужно каким-то образом подключаться к вашей машине, если вы не включили X TCP-соединения (по умолчанию в Debian они отключены). Таким образом, для большинства людей это либо не применяется (без NFS), либо не является проблемой (без подключений X TCP).
Чтобы скопировать файлы cookie при входе в сеанс X рабочего стола, добавьте следующие строки в ~/.xprofile
или ~/.profile
(или в какой-либо другой сценарий, который читается при входе в систему):
case :$DISPLAY:$XAUTHORITY in
:*:?*) XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
Тогда внутри экрана вам нужно только setenv DISPLAY :0
(или любой другой номер дисплея, но он, вероятно, будет :0
как объяснено выше).
¹ В принципе, здесь нет правильных кавычек, но в данном конкретном случае $DISPLAY
и $XAUTHORITY
не будут содержать метасимвол оболочки.