什么是XDG_RUNTIME_DIR?
当我试图从命令行打开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:
如何解决这个问题?
首先要做的事情是: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环境变量来查看X显示的内容:
echo $DISPLAY
您可以输入以下内容来查看sudo
认为您的DISPLAY是什么:
sudo -s echo $DISPLAY exit
如果没有显示任何内容,那就是问题所在。 (见下面的修复)。
XAUTHORITY
但是,如果那不是问题并且在sudo
正确设置了DISPLAY
怎么办? 那你可能想知道, X是否有某种权限阻止其他用户在我的显示器上书写? 如果你认为,你是对的, X有两个主要的授权方法: xauth
和xhost
。 今天最常用的是xauth
(1) ,它使用XAUTHORITY
环境变量。 再次,让我们检查它是否在sudo
正确设置:
echo $XAUTHORITY sudo -s echo $XAUTHORITY exit
如果XAUTHORITY
指向您主目录中的文件,但是当您运行sudo
时它是空白的,那就是问题所在。
FIX:保存环境变量
那么,修复是什么? 如果没有在sudo
保存DISPLAY
或XAUTHORITY
环境变量,您可以通过使用-E
选项告诉sudo
(8)保留环境,如下所示:
sudo -E evince
更好的方法:env_keep
您可能会问,等等,如果-E
让一切都神奇地起作用,那么为什么它不是sudo
的默认值? 答案是它存在潜在的安全隐患。 环境变量会影响程序的工作方式,并且您不希望它们都从用户帐户导出到根目录。 “正确”的方法是使用visudo
(8)将行Defaults env_keep += "DISPLAY XAUTHORITY"
到sudoers
(5)文件中。 您可以通过运行来检查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 ,可以轻松地在您的计算机上运行程序,这些程序会显示在屏幕上显示的其他主机上的其他主机和程序上(假设您允许它们)。
XDG_RUNTIME_DIR
是在X Windows上下文中设置的环境变量,因此程序可以查找内容。 你( neo
)已经设置了图形上下文。
通过尝试以root
身份运行evince
,您已进入用户( root
)尝试访问另一个用户( neo
)显示的情况。 这被视为一件坏事。
如果您决定必须以root
身份运行图形编辑器,请阅读man gksudo
并使用gksudo
。