Что такое XDG_RUNTIME_DIR?

14

Пока я пытался открыть Evince из командной строки, он выдает ошибку

neo@Muhammad:~$ sudo evince

No protocol specified

** (evince:4164): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.
Cannot parse arguments: Cannot open display:

Как решить эту проблему?

Мухаммед Ильяс
источник
1
Расскажите нам больше о вашей операционной системе.
ДК Бозе

Ответы:

29

Перво-наперво: XDG_RUNTIME_DIR

Чтобы ответить на ваш первый вопрос: «Что такое XDG_RUNTIME_DIR?» Это переменная среды, которая устанавливается автоматически при входе в систему. Она сообщает любой запущенной программе, где найти пользовательский каталог, в котором можно хранить небольшие временные файлы. Обратите внимание, что XDG_RUNTIME_DIRэто установлено в pam_systemd(8) , так что оно на самом деле не связано с X (графический запуск программ), что является проблемой, которую вы, похоже, испытываете.

Как устранить неполадки

Ваш второй вопрос: «Как решить эту проблему?» это очень хороший. Это означает, что вы заинтересованы не только в том, что это за исправление, но и в том, как его решить самостоятельно. Для начала сначала посмотрите на первые сообщения об ошибках. В частности, поиск No protocol specifiedили WARNING **: Could not open X displayдолжен показать вам, что проблема связана с X (также называемой X Windowing System ), которая заключается в том, как графические программы отображаются на вашем экране. Знание этого должно вызвать у вас множество вопросов по устранению неполадок.

X DISPLAY

Ваш следующий вопрос может быть таким, что это за «дисплей Х», который не может открыться? «Дисплей» - это адрес вашего экрана. [*] Любая программа, которая хочет записать на ваш экран, должна знать адрес. Вы можете увидеть, что представляет собой ваш дисплей X, проверив переменную окружения DISPLAY:

echo $DISPLAY

И вы можете проверить, что sudoдумает ваш DISPLAY, набрав:

sudo -s
echo $DISPLAY
exit

Если это ничего не показывает, тогда это проблема. (См. Исправление ниже).

XAUTHORITY

Но что, если проблема не в этом, и DISPLAYон установлен правильно sudo? Тогда вы можете спросить, есть ли у X какие-то разрешения, которые мешают другим пользователям писать на моем дисплее? Если бы вы думали об этом, вы были бы правы, у X есть два основных метода авторизации: xauthи xhost. Наиболее часто используемым сегодня является xauth(1), который использует XAUTHORITYпеременную окружения. Опять же, давайте проверим, правильно ли он установлен в sudo:

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

Если XAUTHORITYуказывает на файл в вашем домашнем каталоге для вас, но он пуст при запуске sudo, то это проблема.

ИСПРАВЛЕНИЕ: Сохранить переменные среды

Так в чем же дело? Если переменные среды DISPLAYили XAUTHORITYне сохраняются во всей папке sudo, вы можете указать sudo(8) сохранить среду с помощью -Eпараметра, например, так:

sudo -E evince

Лучший способ: env_keep

Вы могли бы хорошо спросить, подождите, если -Eвсе работает волшебным образом, то почему это не по умолчанию sudo? Ответ в том, что это потенциальная угроза безопасности. Переменные среды влияют на работу программ, и вы не хотите, чтобы все они экспортировались из учетной записи пользователя в корневой каталог. «Правильный» способ сделать это - добавить строку Defaults env_keep += "DISPLAY XAUTHORITY"в файл sudoers(5), используя visudo(8) . Вы можете проверить, какие переменные среды sudo сохраняет, запустив:

sudo sudo -V

(Да, вы печатаете sudoдважды). Я рекомендую помещать строку не в файл sudoers по умолчанию ( /etc/sudoers), а в локальный файл, который не будет перезаписан при обновлении системы. Вы можете сделать это так:

sudo visudo -f /etc/sudoers.d/local 

Но подождите, что если ничего из вышеперечисленного не сработает?

Я думаю, что это довольно подробный ответ, но если у вас все еще есть проблемы, я бы предложил еще одну вещь. Вы можете использовать xhost(1) для предоставления доступа конкретному пользователю на локальном хосте (вашей машине), например,

xhost si:localuser:root

В данном случае мы указываем rootимя пользователя, так как это учетная запись, под которой sudoзапускаются программы.


[*] : В : У меня только один экран, так почему для дисплея X нужен "адрес"? A: Это потому, что X может работать не только на вашем компьютере, но и через Интернет. С помощью X легко запускать программы на вашем компьютере, которые отображаются на других хостах Интернета, и программы на других хостах, которые отображаются на вашем экране (при условии, что вы даете им разрешение).

hackerb9
источник
Спасибо за подробный ответ. Я уверен, что в вашем ответе есть что-то новое для каждого пользователя. (Для меня: как предоставить доступ к X конкретному пользователю, что лучше, чем выдача, xhost +чтобы разрешить универсальный доступ.)
drumfire
3

XDG_RUNTIME_DIRпеременная окружения, установленная в контексте X Windows, чтобы программы могли что-то находить Вы ( neo) настроили графический контекст.

Пытаясь запустить evinceкак root, вы ввели условие, когда пользователь ( root) пытается получить доступ к neoэкрану другого пользователя ( ). Это считается плохой вещью.

Если вы решили, что ДОЛЖНЫ запустить графический редактор как root, прочитайте man gksudo и используйте gksudo.

waltinator
источник
интересный комментарий. Вы случайно не знаете, как я мог что-то подобное? journalctl -b -p err | wl-copyон сообщает, Failed to connect to a Wayland serverчто имеет смысл, но звучит глупо от пользователя POV.
MH-Cbon