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

sas*_*alm 40 shell xorg su x11

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

例子:

user1@laptop:~$ su - user2
user2@laptop:~$ leafpad ~/somefile.txt
No protocol specified
leafpad: Cannot open display: 
Run Code Online (Sandbox Code Playgroud)

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

slm*_*slm 48

su vs. su -

当成为另一个用户时,您通常希望使用su - user2. 破折号将强制.bash_profile用户 2 获得来源。

主机

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

注意:运行时,xhost +您仍希望在属于 user1 的 shell 中运行它。

$DISPLAY

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

$ export DISPLAY=:0.0
Run Code Online (Sandbox Code Playgroud)

  • `xhost +` 将允许任何可以连接到您的 x 服务器的主机上的任何用户访问您的屏幕。`xhost +SI:localuser:user2` 在 Debian 上对我有用。 (9认同)
  • 哦,发现了一些东西。在 Fedora 21 上运行 `xhost` 会给出一个格式为 `SI:localuser:USERNAME` 的列表,所以 `xhost SI:localuser:user2` 应该可以工作。哦,用户的显示可以使用 `w` 找到。 (6认同)
  • 更多 xhost 详细信息和选项(基于 debian solydX):这将允许任何本地用户访问显示:`xhost +local:` 从手册页:“本地系列同时指定所有本地连接。但是,服务器解释地址“si:localuser:username”可用于指定单个本地用户”所以这对我有用:`xhost + si:localuser:[username]` (3认同)

小智 12

您可以使用 X11 转发:

ssh -XY otheruser@localhost your-gui-program-name-here
Run Code Online (Sandbox Code Playgroud)

  • 这是一个绝妙的解决方案。迄今为止我读过的最简单的。熟悉 ssh 的人远多于熟悉 x11 配置的人。 (3认同)

小智 10

您需要从user1共享身份验证令牌(假设~user1 的家):

cat ~/.Xauthority | sudo -u user2 -i tee .Xauthority > /dev/null
Run Code Online (Sandbox Code Playgroud)


小智 9

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

$ xhost +
$ sudo su user2
Run Code Online (Sandbox Code Playgroud)

(输入通行证)

$ gimp
Run Code Online (Sandbox Code Playgroud)

享受 :)