如何启动共享 X 服务器以供远程、非转发使用?

如何启动共享 X 服务器以供远程、非转发使用?

我不确定我问的问题是否正确,所以这就是我真正想要做的:

我有一台服务器,上面连接着一个屏幕,没有其他设备。它正在运行 SSH 服务器。

我希望 Alice 能够连接到服务器并以“staff”身份运行命令以在屏幕上显示图片。例如...

ssh server sudo -u 'staff' gst-launch-1.0 playbin uri=file:///path/to/image.png

Alice 回家了,图像仍然显示。Bob 进来了,决定要一张不同的图像:

ssh server sudo -u 'staff' gst-launch-1.0 playbin uri=file:///path/to/other.png

需要如何启动和配置 X 服务器才能满足我的需求?只有“工作人员”用户才需要操作显示。

我知道我可以使用 xinit 在启动时启动服务器并运行我选择的程序。我应该运行什么程序?它应该做什么?我需要传递哪些环境变量?

答案1

在常见的 Linux 环境中,X 服务器使用 MIT-MAGIC-COOKIE-1 协议来授权对显示器的访问。任何想要访问显示器的用户都需要拥有正确的曲奇饼(通常存储在 ~/.Xauthority 文件中)。通常,cookie 由显示管理器(登录屏幕)生成。如果您从自定义脚本启动 X 服务器,则必须自行生成 cookie,并将其存储在权威文件并将该文件告知服务器。

您可以使用命令mcookie生成 cookie 并将其添加到授权文件中xauth

# touch /home/staff/.Xauthority
# xauth -f /home/staff/.Xauthority add :0 . $(mcookie)

参数-f /home/staff/.Xauthority告诉xauth使用权限文件的职员用户。:0是显示名称。点 ( .) 指定 MIT-MAGIC-COOKIE-1 协议。mcookie来自util-linux包裹。

现在如果你执行:

# xauth -f /home/staff/.Xauthority list

你应该看到类似这样的内容:

server/unix:0  MIT-MAGIC-COOKIE-1  c61bdc0b88cf0cb376e1b29647a8c4d6

当您以以下身份登录时职员用户应该会看到相同的输出没有-f 参数:

$ xauth list
server/unix:0  MIT-MAGIC-COOKIE-1  c61bdc0b88cf0cb376e1b29647a8c4d6

如果没有,请检查XAUTHORITY环境变量是否未定义或者是否设置为“/home/staff/.Xauthority”。

使用参数启动X服务器-auth

# X -auth /home/staff/.Xauthority

现在职员用户可以访问显示:0。剩下的唯一事情就是设置环境变量DISPLAY——这可以通过参数来完成sudo。因此,当您 ssh 到服务器并执行显示图像的命令职员用户则应该显示。使用 L. Levrel 建议的 ImageMagick,命令如下:

# ssh server sudo -u staff DISPLAY=:0 display -window root /path/to/image.png

笔记你不必使用职员用户。您可以在公共位置(例如 /var/tmp/xauthority)创建授权文件,并XAUTHORITY爱丽丝鲍勃到那条路。

另一种方法是将 cookie“分发”给爱丽丝的鲍勃的授权文件(这实际上与显示管理器所做的类似):

# xauth -f /var/tmp/xauthority extract - :0 | xauth -f /home/alice/.Xauthority merge
# xauth -f /var/tmp/xauthority extract - :0 | xauth -f /home/bob/.Xauthority merge

这边走爱丽丝鲍勃无需执行任何操作sudo staff即可访问显示屏。

笔记如果您有多个 X 服务器正在运行,则必须使用与:0上述命令不同的显示名称(例如::1:2等)。

答案2

如果您安装了 ImageMagick,您可以使用:

display -window root /path/to/image.png

文档。 有有很多选择. 你可能至少需要-display

相关内容