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