当我试图打开表明从命令行,它给了我一个错误
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
首先:XDG_RUNTIME_DIR
回答你的第一个问题,“XDG_RUNTIME_DIR 是什么?”,它是您登录时自动设置的环境变量。它会告诉您运行的任何程序在哪里找到一个用户特定的目录,它可以在其中存储小型临时文件。请注意XDG_RUNTIME_DIR
设置pam_systemd
(8),所以它实际上与X(以图形方式运行程序),这似乎是您遇到的问题。
如何排除故障
你的第二个问题,“如何解决这个问题?”是一个很好的例子。这意味着你感兴趣的不仅仅是什么解决办法是,但同时如何自行解决。首先,先查看第一个错误消息。特别是,搜索No protocol specified
或WARNING **: Could not open X display
,应该会显示问题出在X(也叫X 窗口系统) 即图形程序在屏幕上的显示方式。了解这一点应该会让您想到许多故障排除问题。
X显示
你的下一个问题可能是,这是什么“X 展示”evince 无法打开?“display”是屏幕的地址。[*]任何想要写入屏幕的程序都必须知道该地址。您可以通过检查 DISPLAY 环境变量来查看 X 显示器:
echo $DISPLAY
您可以sudo
通过输入以下内容来检查您的 DISPLAY 是什么:
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
更好的方法: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,您可以轻松地在您的机器上运行显示在其他互联网主机上的程序,以及运行出现在您屏幕上的其他主机上的程序(假设您授予它们权限)。
答案2
XDG_RUNTIME_DIR
是在您的 X Windows 上下文中设置的环境变量,以便程序可以找到内容。您 ( neo
) 已设置图形上下文。
通过尝试evince
以 的身份运行,您已进入用户 ( ) 尝试访问另一个用户 ( ) 显示root
的情况。这被视为一件坏事。root
neo
如果您决定必须运行图形编辑器root
,请阅读man gksudo
并使用gksudo
。