6

Я использую wmctrl на машине с Ubuntu для управления окнами из скрипта, который я запускаю на экране (gnu).

Если я запускаю сеанс экрана с локального компьютера, wmctrl работает нормально, в том числе если я полностью закрываю окно терминала и выдаю команды wmctrl при удаленном подключении к экрану через ssh. И наоборот, если я удаленно подключаюсь по ssh и запускаю экран, wmctrl не работает (возвращает "Не удается открыть дисплей"), даже если я подключаю этот сеанс экрана локально из терминала Ubuntu.

Я предполагаю, что есть некоторый скрытый параметр экрана, который не устанавливается таким образом, который позволяет получить доступ к дисплею, когда он запускается удаленно - любые идеи, что это такое и как изменить его в удаленном сеансе ssh-screen, чтобы скрипт может получить доступ к окнам?

2 ответа2

8

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

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 не будут содержать метасимвол оболочки.

3

Если вы просто хотите запустить одну единственную команду, вам, скорее всего, это сойдет с рук:

env DISPLAY=:0 XAUTHORITY=/home/UserOfDesktop/.Xauthority wmctrl -r "Firefox" -e 0,0,0,1920,1080

Обязательно измените DISPLAY =:0 на рабочий стол, которым вы хотите манипулировать, а UserOfDesktop на имя пользователя, выполняющего сеанс X.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .