第一件事: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显示
您的下一个问题可能是,显示无法打开的“ X显示”是什么?“显示”是屏幕的地址。[*]任何要写入屏幕的程序都必须知道地址。您可以通过检查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
,那么就是问题所在。
FIX:保存环境变量
那么,解决方法是什么?如果DISPLAY
或XAUTHORITY
环境变量未在上保存,则sudo
可以使用选项告诉sudo
(8)保留环境-E
,如下所示:
sudo -E evince
更好的方法:env_keep
您可能会问,等等,如果-E
一切都能神奇地工作,那为什么不是默认的sudo
呢?答案是,这是潜在的安全隐患。环境变量会影响程序的工作方式,并且您不希望它们全部从用户帐户导出到根目录。“正确”的方法是使用(8)将行添加Defaults env_keep += "DISPLAY XAUTHORITY"
到sudoers
(5)文件中。您可以通过运行以下命令检查sudo保留哪些环境变量:visudo
sudo sudo -V
(是的,您键入sudo
两次)。我建议不要将行放在默认的sudoers文件(/etc/sudoers
)中,而应放在升级系统时不会被覆盖的本地文件中。您可以这样做:
sudo visudo -f /etc/sudoers.d/local
但是,等等,如果以上都不起作用怎么办?
我认为这是一个相当彻底的答案,但是如果您仍然遇到问题,我建议您做一件事。您可以使用xhost
(1)向本地主机(您的计算机)上的特定用户授予访问权限,如下所示:
xhost si:localuser:root
在这种情况下,我们指定root
用户名,因为这是sudo
运行程序的帐户。
[*]:问:我只有一个屏幕,为什么X显示器需要一个“地址”?答:这是因为X不仅可以在您的计算机上工作,而且可以在Internet上工作。使用X,很容易在您的计算机上运行显示在其他Internet主机上的程序以及在屏幕上显示的其他主机上的程序(假设您授予它们的权限)。