我想通过 ssh 从我的 Windows 机器连接到远程 Linux 机器,并将该机器上的 x11 服务器转发到我的机器,以便能够查看小型交互式窗口,例如由 matplotlib(使用 qt 后端)生成的窗口。由于 WSL2 已经以某种方式转发了 x11,我猜我不需要在我的 Windows 机器上安装任何其他东西,我只需通过 x11 转发通过现有的 WSL 安装进行代理即可。我通过运行以下命令进入 wsl2 ubuntu(在安装了 openssh 的 Windows powershell 上):
ssh -X <wsl-user>@localhost -p 2222
(我已经将 wsl 实例中运行的 ssh 服务器配置为使用端口 2222)然后我执行此操作:
ssh -X <remote-user>@<remote-host>
并且成功了!(我可以查看 GUI xclock
)
因为我想<remote-host>
使用 vscode Remote-Host 扩展进行连接,所以我希望能够配置远程主机以自动完成所有这些中间工作。我的 ssh 配置如下所示:
Host remote-host
HostName <remote-host>
User <remote-user>
ForwardX11 yes
ProxyJump wsl
Host wsl
HostName localhost
User <wsl-user>
Port 2222
ForwardX11 yes
现在,当我运行 时ssh remote-host
,它应该等同于上一个过程。但看起来情况并非如此。当我xclock
在远程机器上运行时,我得到了输出:
connect 127.0.0.1 port 6000: Connection refused
Error: Can't open display: <remote-hostname>:12.0
我尝试了 proxycommand 选项,我认为它足够通用,可以完全满足我的要求,但它也不起作用(可能是因为我对它了解不够)。更改 wsl 和远程计算机配置中的 X11UseLocalhost 选项也无济于事。
我不明白为什么 ProxyJump(和 X11Forwarding 选项)不是我为实现此功能所需要做的全部。
(我也曾摸索过 X11ForwardingTrusted 选项,因为在连接到配置的主机后会出现一条消息:Warning: No xauth data; using fake authentication data for X11 forwarding.
,但这个警告也会在工作方法中出现)
更新:我使用有效方法和有问题的方法连接到我的机器,似乎DISPLAY
环境变量在 proxyjump 方法中设置不正确;重新导出变量以匹配有效方法有效。然而,这是一个令人沮丧的补丁,我相信有比打开 2 个连接更好的方法。
更新 2:看来我把事情复杂化了太多。WSL2 似乎不使用 X11 转发在 Windows 中显示。通过 WSL 代理跳转到远程系统,我实际上将我的 Windows 显示转发到远程,而不是我的 WSLdisplay。由于我的 Windows Display 没有 X11 客户端,因此失败了。我可以简单地ssh
从没有 X11 转发的内置 Windows 客户端和ssh
带有 X11 转发的 WSLssh 客户端,并在 Windows-remote 会话中使用 WSL-remote 会话创建的 DISPLAY 变量。这仍然让我有 2 个会话,但至少我没有毫无意义地进行代理跳转。我尝试使用ssh
命令直接使用 WSL 客户端wsl ssh ...
,但 vscode Remote-SSH 不喜欢使用 wslssh
而不是内置的 windows ssh
。这将我们带到了在 vscode 中使用 WSL 的话题ssh
,这不是原始问题的重点,所以我就此打住。