什么是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_DIRpam_systemd (8)设置 ,因此它实际上与X (以图形方式运行程序)无关,这是您似乎遇到的问题。

如何排除故障

你的第二个问题, “如何解决这个问题?” 是一个非常好的。 这意味着您不仅对修复内容感兴趣,而且还对如何自行解决问题感兴趣。 首先,请先查看第一条错误消息。 特别是,搜索未No protocol specifiedWARNING **: 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有两个主要的授权方法: xauthxhost 。 今天最常用的是xauth (1) ,它使用XAUTHORITY环境变量。 再次,让我们检查它是否在sudo正确设置:

 echo $XAUTHORITY sudo -s echo $XAUTHORITY exit 

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

FIX:保存环境变量

那么,修复是什么? 如果没有在sudo保存DISPLAYXAUTHORITY环境变量,您可以通过使用-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