为什么我不能从“root”运行 GUI 应用程序:“未指定协议”?

Oct*_*pus 55 kde gui debian x11

我昨晚在我的机器上安装了 debian。现在,我不明白为什么在以 root 身份运行时无法从终端运行 GUI 应用程序。

例如:

sudo -i
glxgears
Run Code Online (Sandbox Code Playgroud)

生成以下输出:

No protocol specified
Error: couldn't open display :0
Run Code Online (Sandbox Code Playgroud)

但是当我第一次打开终端时,我可以glxgears从用户帐户运行。只有在我这样做之后sudo -i,问题才会出现。我尝试运行的任何 GUI 应用程序都会发生这种情况。我认为它可能与 X11 有关,但我不确定。

mic*_*has 52

访问 X 服务器需要做两件事:

  • $DISPLAY指向正确显示的变量(通常为:0
  • 正确的认证信息

身份验证信息可以通过 明确指定$XAUTHORITY~/.Xauthority否则默认为。

如果$DISPLAY$XAUTHORITY为您的用户sudo设置,也会为新的 shell 设置它们,一切都应该正常工作。

如果未设置它们,它们可能会默认为错误的值并且您无法启动 X 应用程序。

在 Debian$XAUTHORITY中通常没有明确设置。只需添加

export XAUTHORITY=~/.Xauthority
Run Code Online (Sandbox Code Playgroud)

对您.bashrc或明确说XAUTHORITY=~/.Xauthority sudo ...,一切都应该有效。

您还可以使用xauth list来检查是否有正确的身份验证信息可用。

  • 请注意,`xhost +` 完全禁用身份验证,并允许每个人访问您屏幕上的所有应用程序... (4认同)
  • `xhost +si:localuser:root` 似乎工作类似。 (3认同)
  • `xauth info` 显示授权文件的路径 (2认同)
  • `xhost +` 解决了我的问题 (2认同)

Huy*_*ens 30

我和你有同样的问题,但对于普通用户。假设我想使用用户帐户 foo 启动 Firefox。我以 bar 身份登录:

[bar@localhost ~]$ sudo -u foo -H firefox
Run Code Online (Sandbox Code Playgroud)

遗憾的是,该命令失败并出现与问题相同的错误(即未指定协议且无法打开显示)

我的解决方案是简单地将用户 foo 添加到 X 服务器的授权访问列表中。

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

就是这样,然后我就可以使用sudo用户 foo启动 Firefox(和其他 X 应用程序)。

背景:在 X Window 上,有一个客户端/服务器架构。当您启动应用程序时,您请求 X 服务器授权以显示它。默认情况下,一旦您打开一个会话(您以图形方式登录),您(您的用户)显然可以与服务器和显示应用程序进行通信。除非您指定,否则其他用户没有此权限。xhost是一个操作权限列表的工具。在si表示该规则是服务器端,并授权本地用户foo来显示应用。X Window 在这方面非常强大,您可以通过使用DISPLAY环境变量和xhost(但不限于)在本地显示远程应用程序。在过去,当人们打字时xhost + 并且隐含地允许每个人使用他们的 X 会话,有可能在他们的屏幕上显示应用程序以进行恶作剧 ;-) 现在没有那么多,因为人们越来越少地使用 X Window 客户端/服务器架构(至少对于我在过去 10 年)。

PS:我这样做是为了在某种“监狱”中启动 Firefox(以避免将来出现pdf.js 之类漏洞)。但是我很快发现通过 sudo 调用 Firefox 将不允许它访问音频和视频硬件。但是有一个人清楚地解释了如何在通过 sudo 调用 Firefox 时激活视频硬件加速和音频。带有这些说明的 YMMV,例如,我仍然有音频被拒绝的许可,但视频很好(在 SELinux ON 的 Fedora 22 上测试)。

  • 在我的例子中,“foo”是“root”,即我必须在 Ubuntu 17.10 上运行“xhost si:localuser:root”。 (2认同)

X T*_*ian 11

你可以

通过添加指定要在命令行上使用的显示 -display :0.0

或者

在 root 的登录脚本(.bashrc、.profile、.bash_profile ... 之一)中设置环境变量。

export DISPLAY=:0.0

你可以检查它是否设置,

$ env |grep DISPLAY
DISPLAY=:0.0
Run Code Online (Sandbox Code Playgroud)

要以普通用户身份为所有主机的所有用户打开显示,您可以使用以下命令:

xhost +

编辑:感谢并感谢@Toby Speight 在下面对更有针对性的建议发表评论,而不是向任何人开放。

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

  • `xhost +si:localuser:root` 将是一种更有针对性的方法,比允许所有用户更好。 (4认同)

Tob*_*ght 5

鉴于您使用的是 Debian,简单且受支持的解决方案是安排sudo复制您的 X11 授权凭证。 正是为此目的pam_xauth而包含在libpam-modules包装中;要使用它,您只需要添加

session  optional  pam_xauth.so
Run Code Online (Sandbox Code Playgroud)

到您的/etc/pam.d/sudo文件。您也可以选择将其添加到su。当然,有关完整信息,请参阅pam_xauth手册页。