В то время как я пытался открыть Evince from Command line, он дает мне ошибку
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:
Как диагностировать эту проблему?
XDG_RUNTIME_DIR
набор переменной среды в Вашем контексте X-окон, так, чтобы программы могли найти вещи. Вы (neo
) настроили графический контекст.
Путем попытки работать evince
как root
, Вы ввели условие, где пользователь (root
) пытается получить доступ к другому пользователю (neo
) дисплей. Это рассматривается как Плохая Вещь.
, Если Вы решаете, НЕОБХОДИМО выполнить графического редактора как root
, читать man gksudo
и использовать gksudo
.
Отвечать на Ваш первый вопрос, "Что такое XDG_RUNTIME_DIR?", это - переменная среды, которая установлена автоматически, когда Вы входите в систему. Это говорит любой программе, что Вы работаете, где найти определенный для пользователя каталог, в котором это может хранить маленькие временные файлы. Отметьте это XDG_RUNTIME_DIR
установлен pam_systemd
(8), таким образом, это на самом деле не связано с X (запущение программ графически), который является проблемой, которую Вы, кажется, имеете.
Ваш второй вопрос, "Как диагностировать эту проблему?" очень хороший. Это означает, что Вы интересуетесь не только, что фиксация, но также и как понять это самостоятельно. Для запуска посмотрите на первые сообщения об ошибках сначала. В частности, поиск No protocol specified
или WARNING **: Could not open X display
, должен показать Вам, что проблема с X (также названный X Системами управления окнами), который является, как графические программы показывают на Вашем экране. Знание, которое должно поднять много вопросов поиска и устранения неисправностей в Вашем уме.
Ваш следующий вопрос мог бы быть, каковы эти "X дисплеев", которые проявляют, не может открыться? "Дисплей" является адресом для Вашего экрана. [*] Любая программа, которая хочет записать в Ваш экран, должна знать адрес. Вы видите то, что Ваши X дисплеев путем проверки переменной среды ДИСПЛЕЯ:
echo $DISPLAY
И можно проверить что sudo
думает, что Ваш ДИСПЛЕЙ путем ввода:
sudo -s
echo $DISPLAY
exit
Если это ничего не показывает, то это - проблема. (См., фиксируют ниже).
Но, что, если это не проблема и 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
Вы могли бы хорошо спросить, Ожидать, если -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
запускает программы как.
[*]: Q: я только получил один экран, итак, почему X отображается, нуждаются в "адресе"? A: это - потому что X может работать не только над Вашей машиной, но и по Интернету. С X, легко запустить программы на Вашей машине, которые обнаруживаются на других узлах Интернета и программах на других хостах, которые появляются на Вашем экране (предполагающий, что Вы даете им разрешение).