权威

权威

当我试图打开表明从命令行,它给了我一个错误

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 specifiedWARNING **: 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有两种主要的授权方法:xauthxhost。目前最常用的是xauth(1)它使用XAUTHORITY环境变量。再次检查它是否正确设置sudo

echo $XAUTHORITY
sudo -s
echo $XAUTHORITY
exit

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

修复:保存环境变量

那么,解决办法是什么?如果DISPLAYXAUTHORITY环境变量没有在 中保存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的情况。这被视为一件坏事。rootneo

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

相关内容