在另一个用户的显示器上运行 X 程序

在另一个用户的显示器上运行 X 程序

在 中运行 Ubuntu 16.04 host,我有以下设置:

  • a user1,谁在 中执行了 GUI 登录host
  • a user2,他是 asudoer并且已登录仅有的通过文本ssh连接 ( ssh user2@host)。

user2例如xclock,我想在user1显示器上运行 X 应用程序。从角度来看,这一定和它本身运行user1时是一样的。user1xclock

该进程的所有者xclock应该是user2,因为这是启动它的用户,但是这是不重要

编辑:我可以使用sudo,但我不能使用user1密码,我不知道密码。

如何做到这一点?


我读这个答案这个答案,但它们没有包含有关此的直接示例。我还阅读了~/.XautorityMIT-MAGIC-COOKIE-1并获得了 cookie 列表xauth list,但无法使用它们。

我尝试过,从连接中的提示ssh(所以,如user2):

$ env DISPLAY=:0 XAUTHORITY=/home/user1/.Xauthority xclock

但这会导致提示永远不会返回。请注意,作为sudoer,user2可能是有能力的读取/复制/写入主目录.Xauthority中的文件。然而,即使和相同user1,上述命令也不起作用。user2user1

答案1

我从来没有使用过sudo,但让另一个用户在您的显示器上使用的标准程序是使用 导出身份验证信息xauth(1),而不是手动使用~/.Xauthority

因此,如果user1是在显示器上登录的,则访客 ( user2) 应运行以下命令:

user2$ export DISPLAY=:0
user2$ ssh user1@localhost "xauth extract - $DISPLAY" | xauth merge -
user2$ xclock

su可以用来代替ssh

user2$ su - user1 -c "xauth extract - $DISPLAY" | xauth merge -

答案2

要连接到其他人的 X11 会话,您需要正确的DISPLAY环境变量值和其他用户文件的内容~/.Xauthority

如果user1已本地登录,则其 DISPLAY 变量设置几乎总是:0.0,因为这是第一个本地 X11 显示。

由于user2,你可以这样做:

export DISPLAY=':0.0'
sudo cp ~user1/.Xauthority $TMP/user1_Xauthority
sudo chown user2 $TMP/user1_Xauthority
export XAUTHORITY=$TMP/user1_Xauthority
xclock &

因为DISPLAY=':0.0'告诉 X11 应用程序连接到当地的要通过位于 的 UNIX 套接字进行显示/tmp/.X11-unix/X0,这些命令必须在具有物理显示的同一主机上运行。

从历史上看,X11 协议最初设计为还允许使用 TCP 端口(6000 + 显示器编号)通过网络连接到显示器,但事实证明这并不安全,并且在现代 Linux/Unix 系统上通常默认情况下禁用,因此除非专门启用(启用这通常是一个坏主意),否则使用诸如export DISPLAY=remotehost:0.0将 X11 应用程序的输出推送到所连接的显示器的功能将无法工作。remotehost

答案3

全部所有答案中的注意事项都是有用的,但建议的命令都不是所要求的解决方案。只是为了清楚起见,我尝试在这里提供它。

最好的方法似乎是 mosvy 方法,也是因为文件的权限非常严格~user1/.Xauthority

必须首先获得DISPLAY所使用的活动 的数量。user1例如,它可以从 的输出中获得,who并且通常是:0

如果user2是 a sudoer,则只需要他的密码,而不需要user1密码。根据user2提示:

user2$ export DISPLAY=:0
user2$ sudo -u user1 -i xauth extract - $DISPLAY | xauth merge -
user2$ xclock

或者(充当user1):

user2$ sudo -u user1 DISPLAY=:0 xclock &

答案4

我无法给出完整的解决方案,因为我根本不使用 sudo。在以 user1 身份运行 xclock 之前,必须导出 DISPLAY 和 XAUTHORITY。

su -l user1 -c 'export DISPLAY=:0.0;XAUTHORITY=/home/user1/XAUTHORITY;xclock&'

请注意,这不是一个持久的解决方案,因为 DISPLAY 和 XAUTHORITY 并不总是相同。

相关内容