通过 WSL 进行 X11 转发

通过 WSL 进行 X11 转发

我想通过 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,这不是原始问题的重点,所以我就此打住。

相关内容