Вопрос или проблема
Вот моя ситуация:
У меня есть два (sudo) пользователя на машине:
userA
(создан первым на машине. Здесь же прикреплен дисплей:0
)userB
(создан позже)
Будучи на userA
, я делаю:
export DISPLAY=:0.0
xclock
И часы открываются на DISPLAY:0
как и предусмотрено.
Теперь я хочу, чтобы те же шаги работали на userB
. Но, к сожалению, отображается:
No protocol specified
xhost: unable to open display ":0.0"
Что я попробовал:
- Создал доверительный ключ xauth, используя:
xauth generate :0.0 . trusted
, который снова показываетunable to open display ":0.0"
- Скопировал
/home/userA/.Xauthority
в/home/userB/.Xauthority
. (Примечание: Я не увидел никакого ключа, относящегося к дисплею :0 в списке xauthuserA
, хотя он работает.) - Создал доверительный ключ xauth для
:0
наuserA
и скопировал этот ключ наuserB
.
Ничто из этого не сработало.
Что сработало:
- Я вошел в
userA
. Яexport DISPLAY=:0.0
, а затемxhost +
, чтобы включить доступ от всех клиентов. - Я снова вошел в
userB
. Яexport DISPLAY=:0.0
, а затемxclock
.
Я хочу устранить Шаг 1. Я НЕ хочу входить в userA
каждый раз. И я пытался xhost +
из userB
, но показывается ошибка, уже упомянутая выше.
Как я могу выполнить xhost +
из userB
, при этом заставив его думать, что у него есть доступ к DISPLAY:0
?
Правка: Как упомянул @user414777, я смог:
# На userA
$ xhost +si:localuser:userB
# На userB
$ export DISPLAY=:0.0 ; xclock
И заставить это работать. Но эти изменения не сохраняются после перезагрузки.
# После перезагрузки, на userB
$ export DISPLAY=:0.0 ; xclock
Invalid MIT-MAGIC-COOKIE-1 keyError: Can't open display: :0.0
Я использую Ubuntu 18.04 LTS, 4.18.0-15-generic
РЕШЕНО
В конечном итоге я воспользовался немного небезопасным и модифицированным предложением от @user414777. Вместо того чтобы добавлять изменение в ~/.xsession
или Xsession.d
, я добавил эту строку в /etc/profile
, что применяет изменение для всех пользователей.
На большинстве “современных” Linux-систем вы можете сделать следующее:
xhost +si:localuser:userB
входя как userA
(тот, у кого уже есть доступ к дисплею), тогда userB
сможет подключиться (если она установит правильную переменную окружения DISPLAY
или использует правильные параметры командной строки -display
или --display
).
Это довольно небезопасно, но (по крайней мере на Debian) это единственное, что поддерживается Xwayland
, и они уже принуждают это, даже с обычным Xorg
.
Обычный способ, уже упомянутый в мануале xauth(1)
, и во многих ответах здесь и в других местах, это:
xauth extract - "$DISPLAY" | ssh userB@localhost xauth merge -
но на моей системе это работает только с Xorg
, а не с Xwayland
. С помощью команды выше вы можете использовать su
или sudo
вместо ssh
, или сделать это в два этапа и т. д.
Ответ или решение
Чтобы разрешить доступ к графическому дисплею для второго пользователя в системе Linux, вам необходимо правильно настроить окружение X Window. Ваша задача состоит в том, чтобы userB
мог запустить программы на дисплее :0
, который уже используется userA
. Вот пошаговая инструкция, как это сделать.
1. Использование xhost
для предоставления доступа
Первый и наиболее простой способ — это использование команды xhost
. На userA
, который уже имеет доступ к дисплею :0
, выполните следующую команду:
xhost +si:localuser:userB
Эта команда позволяет userB
подключаться к текущему дисплею. Однако, как вы заметили, после перезагрузки установки доступа пропадают. Чтобы это исправить, нужно учесть сохранение изменений.
2. Автоматизация предоставления доступа после перезагрузки
Наиболее распространенный метод автоматизации — добавление команды xhost
в скрипты автозагрузки, которые выполняются при каждом входе в систему. Чтобы сделать это, следуйте следующим шагам:
-
Создание или редактирование скрипта xsession для userA:
-
Откройте или создайте файл
~/.xsession
или~/.xinitrc
для пользователяuserA
. Обычно это делается с помощью текстового редактора:nano ~/.xsession
-
Вставьте следующую строку:
xhost +si:localuser:userB
-
Сохраните изменения и закройте редактор.
-
-
Перезагрузка:
Теперь, когда вы перезапустите
userA
,userB
будет иметь доступ к дисплею:0
без необходимости вручную вводить командуxhost
после каждой перезагрузки.
3. Альтернативный способ через xauth
Если вы хотите избежать использования xhost
, вы можете использовать систему аутентификации X, называемую xauth
. Этот метод безопаснее, поскольку он создает доверенные ключи для доступа.
Вот пример, как это сделать:
-
На
userA
выполнить:xauth extract - "$DISPLAY" | xauth merge -
Эта команда экспортирует текущие настройки аутентификации и объединяет их в файл
~/.Xauthority
. -
Копирование ключа к
userB
:Поскольку оба пользователя,
userA
иuserB
, находятся на одной машине, можно просмотреть ключи вuserA
и добавить их вuserB
:xauth merge /home/userA/.Xauthority
Убедитесь, что у вас есть необходимые права на доступ к файлу аутентификации.
4. Проверьте переменные окружения
Конечно, вы должны также убедиться, что переменная окружения DISPLAY
правильно установлена у userB
. Это можно сделать с помощью команды:
export DISPLAY=:0
Заключение
Команда xhost
является простым способом предоставить доступ к графическому дисплею другому пользователю, но для повышения безопасности рекомендуется использовать xauth
. Настройка автоматического выполнения этих команд при входе значительно сократит количество необходимых действий после перезагрузки.
Эти шаги обеспечат стабильный и безопасный доступ к графическому интерфейсу между пользователями в системе Linux.