ОТОБРАЖЕНИЕ и ВЛАСТЬ
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 не будут содержать метасимвол оболочки.