Переменная окружения XAUTHORITY пуста в ssh-сессии

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

Когда я подключаюсь к Linux-хосту по SSH, переменная окружения XAUTHORITY не установлена. Если я выполняю sudo -b, соединение разрывается, если я не добавлю команду nohup сразу после, в этом случае операция завершается ошибкой с сообщением X11 connection rejected because of wrong authentication.

В качестве обходного пути я могу вручную установить значение $HOME/.Xauthority.

Эта переменная обычно устанавливается автоматически. Что мне сделать, чтобы гарантировать, что переменная будет установлена в предпочтительном порядке (правильным процессом в нужное время)?

Если файл Xauthority находится по адресу $HOME/.Xauthority, то вам не нужно использовать переменную окружения XAUTHORITY, так как $HOME/.Xauthority является значением по умолчанию: библиотеки X11 должны проверять его автоматически.

Если вы затем используете sudo для перехода к root, то становится сложнее поддерживать доступ к сессии X11 через sudo, поскольку теперь это не просто вопрос сохранения переменных окружения DISPLAY и XAUTHORITY и предоставления пользователю root возможность читать Xauthority откуда угодно: потребуется установить подходящее значение XAUTHORITY в какой-то момент, чтобы определить фактическое расположение файла Xauthority. Не так уж важно, как оно будет установлено, важно лишь, чтобы это произошло до запуска процесса, которому это понадобится.

Если sudo уже настроен на сохранение переменной XAUTHORITY, то вы можете обойти это, явно установив XAUTHORITY в вашем скрипте входа (как ваш первоначальный пользователь перед sudo), если DISPLAY установлено, используя что-то вроде этого:

if [ "$DISPLAY" != "" ] && [ "$XAUTHORITY" = "" ]; then
    export XAUTHORITY=$HOME/.Xauthority
fi

В качестве альтернативы, если sudo не сохраняет XAUTHORITY и/или вы не хотите настраивать sudo для его сохранения, вы можете вставить следующий фрагмент в /etc/bash.bashrc или ~/.bashrc (или любой другой скрипт, исполняемый оболочкой, запущенной командой sudo).

if [ "$SUDO_USER" != "" ] && [ "$DISPLAY" != "" ]; then
    export XAUTHORITY=$(getent passwd "${SUDO_USER}" | cut -d : -f 6)/.Xauthority
fi

Ответ или решение

Когда вы устанавливаете SSH-соединение с хостом на Linux и замечаете, что переменная окружения XAUTHORITY не задана, это может привести к проблемам с использованием X11, особенно когда вы пытаетесь использовать sudo. В данном случае вы получаете ошибку "X11 connection rejected because of wrong authentication". Давайте рассмотрим, как правильно настроить переменную окружения XAUTHORITY.

Проблема

По умолчанию файл Xauthority располагается по пути $HOME/.Xauthority, и X11 библиотеки должны автоматически считать его оттуда. Однако, когда вы используете sudo, вы работаете под пользователем root, что усложняет доступ к вашему X11-сессии. При использовании sudo необходимо учитывать, что вам нужно передать правильные значения переменных DISPLAY и XAUTHORITY.

Решение

  1. Настройка переменной XAUTHORITY в вашем профиле:

    Вы можете добавить следующий код в ваш скрипт входа (например, в ~/.bashrc), чтобы задать переменную XAUTHORITY, если DISPLAY является ненулевым:

    if [ "$DISPLAY" != "" ] && [ "$XAUTHORITY" = "" ]; then
       export XAUTHORITY=$HOME/.Xauthority
    fi

    Это гарантирует, что XAUTHORITY будет установлен при каждом входе в систему, если вы используете X11.

  2. Настройка XAUTHORITY при использовании sudo:

    Если sudo не сохраняет переменную XAUTHORITY, вы можете модифицировать /etc/bash.bashrc или ~/.bashrc (или тот скрипт, который выполняется при запуске оболочки sudo):

    if [ "$SUDO_USER" != "" ] && [ "$DISPLAY" != "" ]; then
       export XAUTHORITY=$(getent passwd "${SUDO_USER}" | cut -d : -f 6)/.Xauthority
    fi

    В данном случае, когда вы используете sudo, XAUTHORITY будет установлен в путь к файлу .Xauthority соответствующего пользователя, что позволяет избежать проблем с аутентификацией X11.

  3. Изменение конфигурации sudo:

    Вы можете настроить sudo так, чтобы он сохранял переменные окружения. Для этого вам нужно отредактировать файл конфигурации sudoers с помощью команды visudo и добавить следующее:

    Defaults env_keep += "XAUTHORITY DISPLAY"

    Это позволит переменной XAUTHORITY и DISPLAY сохраняться при использовании sudo, что упростит доступ к X11 сессии.

Заключение

Следуя приведённым выше шагам, вы сможете правильно настроить переменную XAUTHORITY и избежать ошибок, связанных с аутентификацией при работе с X11 после использования sudo. Убедитесь, что изменения внесены в правильные файлы, чтобы они применялись для всех необходимых сессий. Если после внесения изменений проблема сохраняется, проверьте права доступа к файлу .Xauthority и убедитесь, что они корректны.

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

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