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


38

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

例如:

sudo -i
glxgears

生成以下输出:

No protocol specified
Error: couldn't open display :0

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


1
stackoverflow.com/a/20612084 这对我来说非常理想。

关于Wayland,以防万一:Arch Wiki“带有图形应用程序的sudo在Wayland 上不起作用”
阿列克谢

Answers:


39

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

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

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

如果为您的用户设置了$DISPLAY$XAUTHORITYsudo也将它们设置为新的外壳,一切应该正常。

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

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

export XAUTHORITY=~/.Xauthority

.bashrc或明确地说XAUTHORITY=~/.Xauthority sudo ...,一切都应该工作。

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


1
xauth info显示授权文件的路径
Tomas Tomecek

1
xhost +解决了我的问题
危险

3
请注意,这将xhost +完全禁用身份验证,并允许每个人都访问屏幕上的所有应用程序……
michas

1
对于debian,我是否以root用户身份输入XAUTHORITY导出?因为它在deb10上不起作用?我用sudo su登录
marinara

@marinara使用sudo -i代替sudo su -
michas

23

除了普通用户外,我和您有相同的问题。假设我要使用用户帐户foo启动firefox。我以酒吧身份登录:

[bar@localhost ~]$ sudo -u foo -H firefox

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

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

xhost si:localuser:foo

就是这样,然后我可以使用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启用的Fedora 22上测试)。


1
在我的情况fooroot,即我不得不运行xhost si:localuser:root在Ubuntu 17.10。
Karl Richter

您在哪里添加xhost si:localhost<user>命令?如果没有用户登录,则没有人可以使用X服务器来授予权限。
cbcoutinho

@cbcoutinho上面的用例是当某人登录并想要与其他人在同一主机上运行XWindow应用程序时。如果您解释用例(您要解决的问题是什么),那么我可以为您提供帮助。
惠更斯(Huygens)'18

@Huygens我有一个用于模拟流体的工作站,还配备了GPU。我使用,通常基于工作站本身ParaView构建的程序来渲染可视化效果vtkParaView还通过ssh提供了一个安全的无头客户机/服务器渲染模型,我想利用远程而不是使用VNC。如果不登录工作站并执行xhost,我将无法利用GPU。这意味着我无法远程重启机器,但仍然可以访问GPU。
cbcoutinho

1
@cbcoutinho X Window是客户端服务器体系结构。通过ssh连接时,本地工作站将成为客户端X窗口。您可以将xhost与不安全的协议(例如rlogin)一起使用,但不能与ssh一起使用。您需要指示ssh为您执行此操作。在ssh上使用-X或(更好?)-Y标志,它将进行正确的重定向。当然,您然后需要一个本地C服务器。但是,对于GPU和OpenGL,我不确定渲染/计算在哪里发生,可能是在客户端,而不是在服务器端。可能很棘手。
惠更斯州

10

你可以

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

要么

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

export DISPLAY=:0.0

您可以检查是否已设置,

$ env |grep DISPLAY
DISPLAY=:0.0

要以普通用户的身份打开来自所有主机的所有用户的显示,可以执行以下操作:

xhost +


1
xhost +确实是作为sudo进入之前的临时措施
Octopus

1
xhost +也为我工作,只是他们忘了提到我们应该从授权用户的终端运行它,而不是从下的终端运行它sudo su
nyxee

1
像繁荣一样的完美作品
Adiii

3

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

session  optional  pam_xauth.so

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


2

是什么帮助了我:

  1. 您可以xauth generate :0 . trusteduser一边,这将产生一个新的MIT-MAGIC-COOKIE-1
  2. 使用xauth list' as用户and(they should be the same if yourxAuthority` 检查新创建的Key 是否指向同一文件。

  3. Voila,root将可以X-App从终端上访问任何内容,但只是暂时的。

要使其永久存在,请参见@Huygens的答案!


1

替代解决方案:

如果当前x用户不是root用户,则在root用户下运行的cron之类的服务将无权显示。

我们只需要将root用户添加到x,您可以在登录时使用启动脚本来执行此操作

xhost local:root

出于测试目的,我们可以在当前用户下运行than命令,然后重新启动根脚本/ job / service /。


只是好奇,您为什么要通过cron运行gui应用程序?
章鱼

在我的发行版中,我有一个根cron作业(msec),用于检查系统安全性并做出报告...因此,与其去记录日志以查看报告,我不希望在运行该作业时在报告中包含弹出式GUI
intika


0

sudo命令具有保留环境变量的开关。

 -E, --preserve-env            preserve user environment when running command

这样您就可以使用-E开关运行命令。例:

sudo -E wireshark

如果您不需要运行诸如Web浏览器之类的对隐私至关重要的应用程序,那么最好使用sudo添加-E开关。我们不能仅通过添加-E开关来运行Chrome或Firefox 。因为许多浏览器已实现针对用户空间违规的保护。@huygens的答案可能对此主题有见解。

注意:如果您的用户环境不存在 DISPLAY 并且 XAUTHORITY 已经正确设置,则添加-E开关将无济于事


-1

使用此命令,它将起作用

sudo cp /home/user/.Xauthority .Xauthority

2
这将cp: cannot stat ‘/home/user/.Xauthority’: No such file or directory在我可以访问的任何10台以上基于Debian的机器上提供。
Anthon

这提供了一些上下文(例如,您默默地期待一些当前目录),并且在多个X11实例中这样做时,您没有提及诸如麻烦之类的副作用。我认为这种方式有点怪异。
v6ak
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.