Как включить доступ xhost для второго пользователя, когда дисплей:0 используется первым пользователем?

Вопрос или проблема

Вот моя ситуация:

У меня есть два (sudo) пользователя на машине:

  1. userA (создан первым на машине. Здесь же прикреплен дисплей :0)
  2. userB (создан позже)

Будучи на userA, я делаю:

export DISPLAY=:0.0
xclock

И часы открываются на DISPLAY:0 как и предусмотрено.

Теперь я хочу, чтобы те же шаги работали на userB. Но, к сожалению, отображается:

No protocol specified
xhost:  unable to open display ":0.0"

Что я попробовал:

  1. Создал доверительный ключ xauth, используя: xauth generate :0.0 . trusted, который снова показывает unable to open display ":0.0"
  2. Скопировал /home/userA/.Xauthority в /home/userB/.Xauthority. (Примечание: Я не увидел никакого ключа, относящегося к дисплею :0 в списке xauth userA, хотя он работает.)
  3. Создал доверительный ключ xauth для :0 на userA и скопировал этот ключ на userB.

Ничто из этого не сработало.

Что сработало:

  1. Я вошел в userA. Я export DISPLAY=:0.0, а затем xhost +, чтобы включить доступ от всех клиентов.
  2. Я снова вошел в 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 в скрипты автозагрузки, которые выполняются при каждом входе в систему. Чтобы сделать это, следуйте следующим шагам:

  1. Создание или редактирование скрипта xsession для userA:

    • Откройте или создайте файл ~/.xsession или ~/.xinitrc для пользователя userA. Обычно это делается с помощью текстового редактора:

      nano ~/.xsession
    • Вставьте следующую строку:

      xhost +si:localuser:userB
    • Сохраните изменения и закройте редактор.

  2. Перезагрузка:

    Теперь, когда вы перезапустите userA, userB будет иметь доступ к дисплею :0 без необходимости вручную вводить команду xhost после каждой перезагрузки.

3. Альтернативный способ через xauth

Если вы хотите избежать использования xhost, вы можете использовать систему аутентификации X, называемую xauth. Этот метод безопаснее, поскольку он создает доверенные ключи для доступа.

Вот пример, как это сделать:

  1. На userA выполнить:

    xauth extract - "$DISPLAY" | xauth merge -

    Эта команда экспортирует текущие настройки аутентификации и объединяет их в файл ~/.Xauthority.

  2. Копирование ключа к userB:

    Поскольку оба пользователя, userA и userB, находятся на одной машине, можно просмотреть ключи в userA и добавить их в userB:

    xauth merge /home/userA/.Xauthority

    Убедитесь, что у вас есть необходимые права на доступ к файлу аутентификации.

4. Проверьте переменные окружения

Конечно, вы должны также убедиться, что переменная окружения DISPLAY правильно установлена у userB. Это можно сделать с помощью команды:

export DISPLAY=:0

Заключение

Команда xhost является простым способом предоставить доступ к графическому дисплею другому пользователю, но для повышения безопасности рекомендуется использовать xauth. Настройка автоматического выполнения этих команд при входе значительно сократит количество необходимых действий после перезагрузки.

Эти шаги обеспечат стабильный и безопасный доступ к графическому интерфейсу между пользователями в системе Linux.

Оцените материал
Добавить комментарий

Капча загружается...