我想在服务器上运行 X11 程序并在客户端上显示窗口。
我在服务器上有一个 shell 来启动。 (这不是一个 SSH shell,而是一些集群计算软件)程序必须以某种方式从这个 shell 启动。
我可以通过 SSH 访问并直接访问客户端,但是我无法从客户端通过 SSH 访问服务器。
我想在服务器上运行程序并在客户端上打开窗口。我该怎么做?
答案1
反向隧道法
您可以通过 SSH 从 A 到 B,但您想通过 SSH 从 B 到 A?一个通用的解决方案是创建反向 SSH 隧道。从服务器:
ssh -f -N -R 4222:localhost:22 CLIENT
现在您可以通过 SSH 连接到 CLIENT 上的端口 4222 并登录到服务器。在该连接上打开 X11 转发。
ssh -p 4222 -X localhost
手动设置方法
或者,您可以手动设置 X11 转发到所需的显示器。如果要将:20
CLIENT 上的显示转发到:0
SERVER 上的显示:
ssh -L 6020:localhost:6000 CLIENT
如果应用程序显示正确,则只能使用 X 显示授权。这采用“cookie”(随机生成的值,用作密码)的形式。您需要检索 cookie 值并运行命令xauth add :20 MIT-MAGIC-COOKIE-1 …
。请参阅在远程 X 显示器上打开窗口(为什么“无法打开显示器”)?。对于您的情况,您可以通过xauth list
在 X 会话中运行命令来获取 SERVER 上的 cookie 值。
建立 TCP 转发并设置 cookie 值后,设置export DISPLAY=:20
并运行您的应用程序。
答案2
假设您在服务器上有 ssh(也就是说,您可以通过 ssh 离开服务器,但不能连接到服务器),您可以从服务器端口转发到客户端。
SERVER$ ssh -L6000:127.0.0.1:6000 CLIENT.ip.or.name
6000
这将通过 ssh 隧道将服务器上的本地端口转发到 localhost 端口6000
。