我有一个旧应用程序试图在 CentOS6 上运行,它使用几台机器:abc1 和 abc2。
我登录到 abc1 并运行该应用程序,该应用程序通过 ssh 连接到 abc2,将变量更改DISPLAY
为abc1:0.0
并运行一个尝试在 abc1 上打开新窗口的进程。但是,它失败了:cannot open display
如果我只执行ssh -X abc2
or ssh -Y abc2
,我可以毫无问题地打开 xterm,但 DISPLAY 变量设置为类似localhost:10.0
请注意,abc1 正确解析(我可以从 abc2 ping abc1)
我根本无法修改应用程序,因此无法控制它DISPLAY
正在使用的变量。但是,我可以修改 abc1 和 abc2 的配置。我在一个孤立的网络上,不关心安全性。
ssh 配置中是否有某些内容或其他我可以更改以允许abc1:0.0
工作的内容?
答案1
如果您在本地登录到abc1
,这可能与您无关...但是如果您使用 SSH X11 转发从工作站连接到abc1
,那么您也可以启动嵌套X服务器捕获abc1
传入连接abc1:0.0
并将其传递到安全 SSH X11 隧道内工作站的本地 X 服务器。
在 RHEL/CentOS 6 上,所需的 RPM 软件包是 或xorg-x11-xserver-Xnest
(xorg-x11-xserver-Xephyr
较新的实现,可能性能更好)。
基本上:
- 让常规 X 服务器处于
abc1
不侦听 TCP 连接的默认状态 - 在您的工作站上运行本地 X 服务器
- 建立从您的工作站到的 X11 转发 SSH 连接
abc1
- 启动
Xnest
或Xephyr
在后台使用abc1
适当的选项让他们收听abc1:0.0
- 开始您的应用程序。
参考 @roaima 对这个问题的评论:即使使用旧的 X 应用程序,在应用程序中对 DISPLAY 设置进行硬编码始终是一件极其令人讨厌的事情。
DISPLAY 变量很可能被设置在可配置的地方。例如,它可能在用于运行应用程序的用户帐户的登录脚本中指定。但是,如果修改算作修改应用程序,那么您将必须使用建议的解决方法。
答案2
简要解释发生的情况:
X 转发 viassh
在远程计算机 (abc2) 上创建本地 X 协议套接字,就像远程计算机上的 X 服务器一样,然后通过 ssh 隧道将 X 线协议转发到原始计算机 (abc1)。本地套接字被标识为localhost:10.0
。
OTOH,abc1:0.0
显示器使用旧的 X 网络协议,并期望 abc1 上的 X 服务器侦听正确的端口。在现代系统上默认情况下禁用此功能,因为它非常不安全。
因此,如果您的情况确实希望在 abc2 上运行的应用程序使用在 abc1 上运行的 X 服务器,最简单的方法是在 abc1 上启动 X 服务器,而不使用该-nolisten
选项。为此,您必须找出 X 服务器是如何启动的(通常由显示管理器,例如 xdm/gdm/kdm/lightdm),并修改启动调用。
接下来您要做的就是启用访问控制。在隔离网络上,只需使用xhost +
并允许所有连接即可;否则你可以使用xauth
并添加当前的 MIT magic cookie。详细信息在一定程度上取决于 X 服务器在您的计算机上的配置方式。