以另一个(非root)用户身份运行GUI应用程序


34

假设我有2个用户帐户user1user2。当我以身份登录user1,然后切换为user2使用时su,我可以执行命令行程序,但是GUI程序失败。

例:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 

那么如何运行GUI应用程序?


我发现失败的主要原因之一是因为$XAUTHORITY它仍然设置为user1 ~/.Xauthority,我想程序会尝试读取它,并且失败是因为该文件通常具有模式0600(-rw-------),这意味着它不可用供“其他”组(包括user2)中的任何人阅读。这意味着,如果您chmod o+r ~/.Xauthority(以user1身份),将可以解决此问题。我写了一个脚本来演示这一点。
Braden Best

Answers:


42

su vs. su-

当成为另一个用户时,通常要使用su - user2。破折号将强制user2的.bash_profile来源。

主机

此外,您需要授予用户访问您的显示器的权限。这受X约束。您可以使用该命令xhost +来允许其他用户权限在user1的桌面上显示GUI。

注意:运行时,xhost +您仍要在属于user1的外壳中运行此程序。

$ DISPLAY

成为user2后,您可能需要设置环境变量$DISPLAY

$ export DISPLAY=:0.0

1
xhost +user2仍然给我这个错误- xhost: bad hostname "user2"。我在Google上搜索了一下,看来我需要做xhost +user2@laptopxhost +user2@localhost,不确定是哪一个。然后说xhost +user2@localhost being added to access control list
sashoalm 2014年

1
但是,即使使用添加用户xhost并指定export DISPLAY=:0.0,运行leafpad仍然给我No protocol specified leafpad: Cannot open display:,并且无法运行。我在linuxquestions.org/questions/linux-newbie-8/…上找到了此链接,其中说有一些神奇的cookie和xauth。您是否测试过这些东西是否可以在计算机上正常工作?也许我的配置有所不同?我在使用Debian + LXDE。
sashoalm 2014年

1
谢谢,xhost +工作正常,似乎不需要其他任何东西(无需设置$DISPLAY)。您可以更新您的答案,我会接受吗?
sashoalm 2014年

5
哦,发现了一些东西。在Fedora 21上,运行xhost会以格式提供列表SI:localuser:USERNAME,因此xhost SI:localuser:user2应该可以使用。哦,可以使用找到用户的显示w
2015年

7
xhost +将允许可以连接到X服务器的任何主机上的任何用户访问您的屏幕。xhost +SI:localuser:user2在Debian上为我工作。
robartsd

9

您需要共享来自user1的身份验证令牌(假设它~user1的宿主):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null

1
这是唯一对我有用的答案(Ubuntu 14)。
sudo

此解决方案在远程计算机(= X Win客户端)内运行良好,而其他答案中的xhost解决方案则必须在本地计算机(= X Win服务器)上执行。
Jpsy

使用这种方法可能会更安全,tee -a避免破坏中的任何现有信息  .Xauthority
斯科特


6

您可以从其他用户启动应用。我将从user2启动gimp应用程序,同时以用户1登录(GUI):

$ xhost +
$ sudo su user2

(进入通行证)

$ gimp

请享用 :)


4
这与四岁接受的答案相同。
G-Man说'Resstate Monica''De​​c

你能说出一种更快更好的方法吗?
Antoni Stavrev '18年

我一直使用这种方法,但是对于Debian和Xfce而言,它不再对我有用。(更正:它确实有效,但是我必须export DISPLAY首先接受公认的答案))
giusti

结束会话后,最好通过$ xhost -
Antoni Stavrev

4

您可以尝试sux命令:

sux user2

sux将为您处理$ DISPLAY的内容。您可能需要使用以下命令进行安装:

sudo apt-get install sux

在Debian / Ubuntu下。


4
sux由Debian或Ubuntu不再提供。我能找到的最佳替代方法是添加xhost SI:localuser:root(或任何用户)以~/.xprofile使其永久使用或使用runuser
stefanct

直到包括Debian Stretch在内,都可以gksu/ gksudo很好地工作。仍在Sid中时,由于安全性问题,已在Buster中将其删除。
Matija Nalis

0

作为的替代方法sux,可以安全地运行图形命令(firefox-esr在以下示例中),如下所示$AUTHUSERguest在以下示例中):

AUTHUSER=guest
AUTHSTRING=SI:localuser:${AUTHUSER}
xhost +${AUTHSTRING} > /dev/null
SUDO_ASKPASS=/usr/bin/ssh-askpass
export SUDO_ASKPASS
sudo -k --askpass -u ${AUTHUSER} /usr/bin/firefox-esr
xhost -${AUTHSTRING} > /dev/null
sudo -K

该代码可以:

  1. 使guest用户访问到您的当前用户$DISPLAY通过xhost +SI:localuser:guest
  2. 用于ssh-askpass以图形方式向您询问密码(当然,sudoers(5) NOPASSWD:如果您的安全策略认为还可以,可以使用它来避免这种情况。或者您可以使用其他askpass程序,或者在配置文件中指定它们(请参见参考资料sudo(8)中的详细信息--askpass
  3. 如果密码正确(并且您具有权限sudoers(5)),它将/usr/bin/firefox-esr以另一个用户(guest)的身份运行该命令
  4. 程序完成后,通过撤消了其他用户(guest)的访问权限$DISPLAYxhost -SI:localuser:guest
  5. 最后,sudo -K删除缓存的密码,因此下一次调用ssh-askpass将再次要求您输入密码(而不是使用缓存的密码)

    而它比什么小更多的工作gksu(8)还是sux(8)一样,它可以编写脚本,而且比更安全:

    • xhost + (只要有效,任何用户都可以访问您的图形显示)
    • 其他用户可读的〜/ .xauth(该用户无限期访问您的显示器)
    • 什么gksu/ sux做(临时副本~/.Xauthority,允许指定用户复制您MIT-MAGIC-COOKIE-1使用您的显示,并继续即使gksu / SUX完成(只要你没有关闭机器或注销显示的-屏保,休眠等并没有改变魔术曲奇饼)。

因为它将仅允许一个本地用户访问您的显示器,然后仅在命令运行时(命令完成后,$AUTHUSER将不再能够以任何方式访问您的显示器)。

另一个安全的选择是 ssh -X(没有-Y它实际上会使您不安全!请参阅ForwardX11Trustedssh_config(5)的详细信息),如果您不编写脚本,则更易于使用,但是会导致额外的开销(例如,速度较慢),并且某些程序可能无法正常工作没有不安全感 -Y


-1

您需要将安装UI加载为user2

尝试遵循以下步骤:

root身份登录:

sudo su

测试x服务器:

xclock

如果您看到时钟正在运行,那就很好了,现在尝试运行以下命令:

xhost

结果应如下所示:

xhost SI:localuser:tri
# tri is my user name

现在让user2访问xhost

xhost +SI:localuser:user2

现在尝试再次登录到user2并尝试打开任何GUI程序。


(1)此问题中没有任何内容要求以root身份运行,或者以root身份运行有利。(1b)如果有的话,以root身份运行可能会引起混乱。(2)很少(如果有的话)使用任何理由sudo su。使用  sudo或  su; 选一个。(3)问题用user1和  编写  user2。请用user1和  写下您的答案  user2。(执行或不执行;没有  tri。)(4)如果回答包含的说明,则更好  SI:localuser。…………………………请不要发表评论;编辑  您的答案,使其更清晰,更完整。
斯科特
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.