Вопрос или проблема
Когда я подключаюсь к 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
.
Решение
-
Настройка переменной XAUTHORITY в вашем профиле:
Вы можете добавить следующий код в ваш скрипт входа (например, в
~/.bashrc
), чтобы задать переменнуюXAUTHORITY
, еслиDISPLAY
является ненулевым:if [ "$DISPLAY" != "" ] && [ "$XAUTHORITY" = "" ]; then export XAUTHORITY=$HOME/.Xauthority fi
Это гарантирует, что
XAUTHORITY
будет установлен при каждом входе в систему, если вы используете X11. -
Настройка 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. -
Изменение конфигурации sudo:
Вы можете настроить
sudo
так, чтобы он сохранял переменные окружения. Для этого вам нужно отредактировать файл конфигурацииsudoers
с помощью командыvisudo
и добавить следующее:Defaults env_keep += "XAUTHORITY DISPLAY"
Это позволит переменной
XAUTHORITY
иDISPLAY
сохраняться при использованииsudo
, что упростит доступ к X11 сессии.
Заключение
Следуя приведённым выше шагам, вы сможете правильно настроить переменную XAUTHORITY
и избежать ошибок, связанных с аутентификацией при работе с X11 после использования sudo
. Убедитесь, что изменения внесены в правильные файлы, чтобы они применялись для всех необходимых сессий. Если после внесения изменений проблема сохраняется, проверьте права доступа к файлу .Xauthority
и убедитесь, что они корректны.