Що таке 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
Розкажіть нам більше про вашу операційну систему.
ДК Бозе

Відповіді:


31

Перші речі: 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 ), і це те, як графічні програми відображаються на вашому екрані. Знаючи, що повинно викликати багато питань щодо усунення несправностей у вашому розумі.

X ДИСПЛЕЙ

Наступним питанням може бути, що це за "X-дисплей", який не може відкритися? "Дисплей" - це адреса вашого екрана. [*] Будь-яка програма, яка хоче написати на ваш екран, повинна знати адресу. Ви можете побачити, який ваш 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 потрібна "адреса"? Відповідь: Це тому, що X може працювати не тільки на вашій машині, але і через Інтернет. За допомогою X легко запускати програми на вашій машині, які відображаються на інших хостах в Інтернеті та програми на інших хостах, які відображаються на екрані (якщо ви надаєте їм дозвіл).


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

3

XDG_RUNTIME_DIRце змінна середовище, встановлена ​​у вашому контексті X Windows, щоб програми могли знаходити речі. Ви ( neo) налаштували графічний контекст.

Спробувавши запустити evinceяк root, ви ввели умову, коли користувач ( root) намагається отримати доступ до neoдисплея іншого користувача ( ). Це розцінюється як погана річ.

Якщо ви вирішите, ОБОВ'ЯЗКОВО запустити графічний редактор як root, прочитайте man gksudo та скористайтеся ним gksudo.


цікавий коментар. Ви випадково знаєте, як я міг зробити щось подібне? journalctl -b -p err | wl-copyвін повідомляє, Failed to connect to a Wayland serverщо робить сенс, але звучить німим від користувача POV.
mh-cbon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.