(Адаптовано з Linux: wmctrl не може відкрити дисплей, коли сеанс розпочато через екран ssh + )
ДИСПЛЕЙ та АВТОРІЯ
Програмі X потрібні два фрагменти інформації для підключення до дисплея X.
Потрібна адреса дисплея, яка зазвичай відбувається :0
під час локального входу або :10
, :11
тощо, коли ви віддалено входите в систему (але число може змінюватися залежно від кількості активних підключень X). Адреса дисплея зазвичай вказується в DISPLAY
змінній середовища.
Для відображення потрібен пароль. X паролі відображення називаються магічними файлами cookie . Чарівні файли cookie не вказуються безпосередньо: вони завжди зберігаються у файлах X-авторитету, що представляють собою сукупність записів форми "display :42
has cookie 123456
". Файл повноважень X зазвичай вказується в XAUTHORITY
змінній оточення. Якщо $XAUTHORITY
не встановлено, програми використовують ~/.Xauthority
.
Ви намагаєтесь діяти у вікнах, які відображаються на вашому робочому столі. Якщо ви єдина людина, яка використовує ваш настільний апарат, велика ймовірність, що ім'я відображається :0
. Визначити розташування файлу повноважень X важче, тому що з gdm, встановленим під Debian стисканням або 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)=')
¹).
Копіювання файлів cookie
Інший підхід (за пропозицією Arrowmaster ) полягає в тому, щоб не намагатися отримати значення $XAUTHORITY
в сесії ssh, а натомість змусити X-сеанс скопіювати файли cookie в ~/.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
This У принципі цього не вистачає належного котирування, але в цьому конкретному екземплярі $DISPLAY
і $XAUTHORITY
не міститиме жодного метахарактера оболонки.