什么是 XDG_RUNTIME_DIR?

Muh*_*yas 27 command-line sudo evince

当我试图从命令行打开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:
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

hac*_*rb9 59

第一件事:XDG_RUNTIME_DIR

要回答您的第一个问题,“什么是 XDG_RUNTIME_DIR?” ,它是一个在您登录时自动设置的环境变量。它告诉您运行的任何程序在哪里可以找到可以存储小型临时文件的用户特定目录。请注意,XDG_RUNTIME_DIRpam_systemd(8)设置,因此它实际上与X(以图形方式运行程序)无关,这就是您似乎遇到的问题。

如何排除故障

你的第二个问题,“如何解决这个问题?” 是一个很好的。你有兴趣,这不仅意味着什么的解决方法是,还怎么弄明白你自己的。首先,首先查看第一条错误消息。特别是,搜索No protocol specifiedWARNING **: Could not open X display应该会告诉您问题出在X(也称为X 窗口系统)上,这就是图形程序在屏幕上的显示方式。知道这一点应该会在您的脑海中引发许多故障排除问题。

X 显示

你的下一个问题可能是,这个evince 打不开的“X 显示器”是什么?“显示”是您屏幕的地址。[*]任何想要写入屏幕的程序都必须知道地址。您可以通过检查 DISPLAY 环境变量来查看 X 显示内容:

echo $DISPLAY
Run Code Online (Sandbox Code Playgroud)

您可以sudo通过键入以下内容来检查您认为 DISPLAY 的内容:

sudo -s
echo $DISPLAY
exit
Run Code Online (Sandbox Code Playgroud)

如果它没有显示任何内容,那就是问题所在。(请参阅下面的修复)。

权威

但是,如果这不是问题并且在DISPLAY中正确设置sudo怎么办?那么您可能想知道,X是否有某种权限阻止其他用户在我的显示器上书写?如果您这样认为,那就对了,X有两种主要的授权方法:xauthxhost。今天最常用的是xauth(1),它使用XAUTHORITY环境变量。再次,让我们检查它是否正确设置sudo

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit
Run Code Online (Sandbox Code Playgroud)

如果XAUTHORITY指向您主目录中的一个文件,但在您运行时它是空白的sudo,那么这就是问题所在。

修复:保存环境变量

那么,有什么解决办法呢?如果DISPLAYXAUTHORITY环境变量没有在 中保存sudo,您可以告诉sudo(8)使用该-E选项保留环境,如下所示:

sudo -E evince
Run Code Online (Sandbox Code Playgroud)

更好的方法:env_keep

你可能会问,等等,如果-E让一切都神奇地工作,那为什么它不是默认的sudo?答案是,这是一个潜在的安全隐患。环境变量会影响程序的工作方式,您不希望它们都从用户帐户导出到根目录。执行此操作的“正确”方法是使用(8)将该行添加Defaults env_keep += "DISPLAY XAUTHORITY"sudoers(5)文件中。您可以通过运行来检查 sudo 保留了哪些环境变量:visudo

sudo sudo -V
Run Code Online (Sandbox Code Playgroud)

(是的,您键入sudo两次)。我建议不要将该行放在默认的 sudoers 文件 ( /etc/sudoers) 中,而是放在升级系统时不会被覆盖的本地文件中。你可以这样做:

sudo visudo -f /etc/sudoers.d/local 
Run Code Online (Sandbox Code Playgroud)

但是等等,如果以上都不起作用怎么办?

我认为这是一个相当彻底的答案,但是如果您仍然遇到问题,我还建议您做另一件事。您可以使用xhost(1)向本地主机(您的机器)上的特定用户授予访问权限,如下所示,

xhost si:localuser:root
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们指定root为用户名,因为这是sudo运行程序的帐户。


[*] : Q:我只有一个屏幕,为什么 X 显示器需要一个“地址”?A:这是因为X不仅可以在您的机器上运行,还可以在 Internet 上运行。使用X,可以轻松地在您的计算机上运行显示在其他 Internet 主机上的程序以及显示在您屏幕上的其他主机上的程序(假设您授予他们权限)。

  • 谢谢你的详尽回答。我敢肯定,您对每个用户的回答中至少有一些新内容。(对我来说:如何向特定用户授予对 X 的访问权限,这比发出 `xhost +` 以允许通用访问更好。) (2认同)

wal*_*tor 5

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

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

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