什么是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
告诉我们更多有关您的操作系统的信息。
DK Bose

Answers:


30

第一件事: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有两种主要的授权方法:xauthxhost。今天最常用的是xauth(1)使用XAUTHORITY环境变量。再次,让我们检查一下是否在中正确设置了sudo

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

如果要XAUTHORITY为您指向主目录中的文件,但是在运行时该文件为空sudo,那么就是问题所在。

FIX:保存环境变量

那么,解决方法是什么?如果DISPLAYXAUTHORITY环境变量未在上保存,则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主机上的程序以及在屏幕上显示的其他主机上的程序(假设您授予它们的权限)。


谢谢您的详尽回答。我敢肯定,每个用户的答案中至少都有一些新东西。(对我来说:如何向特定用户授予对X的访问权限,这比发出xhost +允许普遍访问的权限要好。)
drumfire

3

XDG_RUNTIME_DIR是在X Windows上下文中设置的环境变量,以便程序可以查找内容。您(neo)已设置图形上下文。

通过尝试运行evinceroot,你已经进入了一个用户(条件root)正在尝试访问其他用户的(neo)显示。这被认为是一件坏事。

如果您决定必须以运行图形编辑器root,请阅读man gksudo 并使用gksudo


有趣的评论。你碰巧知道我怎么能这样吗?journalctl -b -p err | wl-copy它报告Failed to connect to a Wayland server会产生感觉,但听起来对用户POV来说却是愚蠢的。
mh-cbon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.