我ssh -Y ...
从一台机器(=客户端)连接(通过)到另一台机器(=服务器,实际上在我的局域网中,但它不相关);然后我在服务器上启动一个新的网络命名空间(简称 NNS),我启动一个 xterm(从默认命名空间),它在我的客户端上完美显示,最后,从 xterm 中,我加入非默认 NNS ,
ip netns exec NNSName bash
我可以检查我是否在新的 NNS 中,
ip netns identify $$
我可以在新的 NNS 中运行复杂的程序,例如 OpenVPN。
问题就在这里:我想xeyes
从新的 NNS 中启动一个图形应用程序(即使只是暂时),但我不能,我总是被告知:Unable to open DISPLAY=...
诚然,我只尝试了显而易见的方法:
DISPLAY=:0.0
DISPLAY=:10.0
DISPLAY=localhost:10.0
DISPLAY=localhost:20.0
DISPLAY=ClientName:10.0
DISPLAY=ClientIPAddress:10.0
始终xhost +
在客户端上,用于纯粹的调试目的。
我没有任何问题:
通过从客户端到服务器的连接,在服务器上
ssh -Y ....
运行并在客户端上显示;xeyes
在服务器上启动一个新的 NNS,并启动 NNS 内的图形应用程序以显示在服务器上(IE,在这种情况下忘记客户端)。
当我将这两个东西放在一起(ssh 和命名空间)时,我无法在服务器的新 NNS 中运行的客户端应用程序上显示。
看来标准 TCP 端口 6010 属于与默认 NNS 的 ssh 会话,而新 NNS 应该拥有自己的端口。我当然可以在新的 NNS 中启动 ssh 服务器并直接从客户端连接到服务器的新 NNS,但我想知道:有没有更简单的方法可以做到这一点,IE在客户端的 X11 服务器上显示在服务器的新 NNS 中运行的图形应用程序?
答案1
我遇到了类似的情况,这是我的解决方法。
一些背景:我必须跨越命名空间内的多个 selenium Firefox 实例,以便将它们与不同的 IP 地址绑定。但如你所知,我遇到了错误:
Error: Can't open display: localhost:10.0
我没有像 Marius 建议的那样使用 unix 套接字,而是将 SSHD X11Forwarding 绑定到 * 而不是 localhost(在配置中添加“X11UseLocalhost no”)并使用 socat 重定向简单的 TCP 连接。
注意这样做的安全后果!!!
在 sshd 上进行此更改后,当您从此登录时,显示将自动更改:
DISPLAY=localhost:10.0
对于类似的事情:
DISPLAY=10.0.0.1:10.0
之后我只需要重定向:
ip netns exec my-NNS socat tcp-listen:6010,reuseaddr,fork tcp:192.168.5.130:6010 &
然后你应该能够使用 xeyes、firefox、x-whatever-you-want...:
ip netns exec my-NNS xeyes &
瞧!
答案2
事实上,似乎没有任何标准的做法。
有一个最明显的解决方案:从网络名称空间内启动服务器ssh
,然后使用常用选项从任何远程计算机连接到它,
ssh -Y [email protected]
那么任何图形程序都可以在远程机器的X11服务器上启动。同一主题的各种变体,例如vnc
,也可以。
或者,可以使用常用的工具:iptables
、netcat
、socat
。这是一方法socat
:技巧是,虽然localhost
服务器上的空间和新的网络命名空间上的空间已经分开,但它们的 X11 unix 套接字却没有分开。事实上,您可以从网络命名空间立即打开图形应用程序,这些应用程序将显示在其父计算机的 X 服务器上。因此,通过强制网络命名空间写入其父机器上的新 unix 套接字,我们可以将发送到新套接字的数据重定向到客户X 服务器通过服务器计算机上通常的 ssh X11 转发,甚至无需连接新的网络命名空间,从而提供了更简单的解决方案。
操作如下:在新的网络命名空间中,
export DISPLAY=:1
这将写入一个新的 Unix 套接字,/tmp/.X11-unix/X1
该套接字尚未连接到任何东西。在远程客户端中,使用命令
socat exec:'ssh me@remoteserver socat unix-l\:/tmp/.X11-unix/X1 -' unix:/tmp/.X11-unix/X0
(注意 的转义:)。上面的命令将unix/:1
服务器上套接字的输入发送到unix/:0
客户端上的套接字。您可能必须放松本地(= 在客户端上)控制并检查(= = ) 套接字xhost
的所有权。这比以前的方法要简单得多:不需要在新的网络命名空间上设置 ssh 服务器,甚至不需要获取 IP 地址。它还绕过了 X11 授权的所有问题,例如使用允许某些远程用户或使用 MIT magic cookies (我什至不确定这是否可以完成)。unix/:1
:1
/tmp/.X11-unix/X1
xhost
socat
还有其他方法可以做到这一点(例如,通过抑制-nolisten tcp
客户端 X 服务器上的选项,然后使用 socat 将:1
unix 套接字转发到客户端的端口 TCP6000),但是,即使忽略它们会导致严重的安全问题,它们也是如此任何想象都不是标准的。