我想在只有 ssh 访问权限的远程机器上运行 GUI 应用程序。我不需要,也不想看到 GUI 窗口。(我知道ssh -C -X remote_server
如果我想让 GUI 在我的客户端上,我可以使用类似的方法。)
我知道 X 正在远程机器上运行,如下ps
所示:
root ... /usr/bin/Xorg :0 -br -audit 0 -auth /var/gdm/:0.Xauth -nolisten tcp vt7
我进行了设置DISPLAY=:0.0
,但是当我尝试使用它时,出现“Xlib:服务器拒绝连接到“:0.0””。
在无需 ssh 隧道即可在 Linux 中实现远程 x 显示和除非 DISPLAY=0.0,否则 Xserver 不起作用我看到了使用 gdmsetup 允许 X 监听 TCP 的建议。但是,gdmsetup 是一个 GUI 应用程序!尝试通过 ssh -X 运行它没有成功(“X11 连接因身份验证错误而被拒绝”)。
那么,是否有一个我可以编辑并删除的文本文件-nolisten
?并且,编辑后,如何安全地远程重启 X?(这台机器上正在运行其他程序,因此请求重启是可能的,但并不可取。)如果没有,应该gdmsetup 能够通过 ssh 运行,我应该坚持这个方向吗?
更新:我必须ssh -X
以 root 身份执行会话(以普通用户身份 ssh,然后 sudo 或 su,不起作用)。因此,我使用 gdmsetup 进行了编辑。然后我使用 重新启动了 X。gdm-restart
我也xhost +
从该 ssh -X 会话中执行了此操作。ps 行不再显示该-nolisten tcp
部分。但仍然无法连接到它,使用DISPLAY=:0
或DISPLAY=localhost:0
更新#2:我刚刚注意到,之所以xauth +
没有帮助(重做后ssh -X
)是因为它改变了我的客户端机器,而不是远程服务器!哎呀。幸好我在防火墙里面!(我认为它这样做的原因与 XAUTHORITY 环境变量有关,请参阅 Cougar 的回复。)
答案1
因为看起来您希望您的应用程序现在附加到根拥有的会话:gdm - 登录屏幕。
为什么不启动你自己的 xserver 和你的程序呢:
%> startx /your/program -- :1
(Darren 添加)这正是我所做的。在一个 ssh 会话中,成为 root 用户,然后输入:
startx -- :1 &
export DISPLAY=:1
xhost + &
然后在另一个 ssh 会话中,普通用户:
export DISPLAY=:1
xclock
(仅使用 xclock 作为测试。)
答案2
如果您只需要连接到远程运行的 X 显示器并启动程序,那么这只是授权问题。现在取决于如何设置授权。
一种方法是使用 xhost 并为每个 IP 授予权限,但这非常不安全,因为在此机器上运行的任何程序(或如果您只使用 +,则为任何机器)都可以自动连接到您的 X dislpay 服务器。
常见的方法是使用 X 授权文件。然后您只需要知道这个文件并有权访问它。现在,这取决于分发,该文件是主目录中的 .Xauthority 还是每次启动 X 会话时设置的某个临时文件。
在第一种情况下,一切都开箱即用,在后一种情况下,您需要知道这个临时文件名。找到它的一种方法是查看已在 X 服务器下运行的某些程序(如 windowmanager)环境中的 XAUTHORITY 变量。您可以从 /proc/PID/environ 文件中轻松获取环境变量,如下所示:
cat /proc/12345/environ | xargs -0 -L 1 echo | grep XAUTHORITY
然后只需将 XAUTHORITY 和 DISPLAY 变量导出到你的 shell 并启动你的程序
答案3
看起来你正在竭尽全力让它工作。作为替代方案,我建议在远程机器上安装 FreeNX 并使用 NXClient 访问它。您将通过 ssh 获得完整的远程桌面,并且只需打开终端窗口并运行您的应用程序即可。这比尝试使用 ssh 找出隧道花费的时间更少。