在 中运行 Ubuntu 16.04 host
,我有以下设置:
- a
user1
,谁在 中执行了 GUI 登录host
; - a
user2
,他是 asudoer
并且已登录仅有的通过文本ssh
连接 (ssh user2@host
)。
user2
例如xclock
,我想在user1
显示器上运行 X 应用程序。从角度来看,这一定和它本身运行user1
时是一样的。user1
xclock
该进程的所有者xclock
应该是user2
,因为这是启动它的用户,但是这是不重要。
编辑:我可以使用sudo
,但我不能使用user1
密码,我不知道密码。
如何做到这一点?
我读这个答案和这个答案,但它们没有包含有关此的直接示例。我还阅读了~/.Xautority
,MIT-MAGIC-COOKIE-1
并获得了 cookie 列表xauth list
,但无法使用它们。
我尝试过,从连接中的提示ssh
(所以,如user2
):
$ env DISPLAY=:0 XAUTHORITY=/home/user1/.Xauthority xclock
但这会导致提示永远不会返回。请注意,作为sudoer
,user2
可能是有能力的读取/复制/写入主目录.Xauthority
中的文件。然而,即使和相同user1
,上述命令也不起作用。user2
user1
答案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 并不总是相同。