使用适用于 Linux 的 Windows 子系统进行 X11 转发

使用适用于 Linux 的 Windows 子系统进行 X11 转发

我已经研究这个问题一段时间了,但一直没能找到解决办法。我似乎无法在运行 WSL 的服务器上远程运行 X11 应用程序,也无法将它们显示在同样运行 WSL 的本地 PC 上。

我在两台电脑上运行 WSL,我们称它们为 A 和 B。我在两台电脑上都安装了 VcXsrv,并且可以显示 X11 应用程序本地,即当我坐在其中任何一个前面时。从 AI 可以毫无问题地 ssh 到 B,反之亦然。我的 WSL 主目录中的 .bashrc 文件两个都machines 包括行 export DISPLAY=localhost:0.0 (我也尝试过 DISPLAY=127.0.0.1:0.0——没有什么区别)。

问题是,当我从 A ssh 进入 B,并在 B 上启动一个图形应用程序时,它不是显示在 A 的屏幕上,但它出现在 B 的屏幕上(我使用 Chrome 远程桌面验证了这一点)。从 B 到 A 的 ssh 连接时也观察到了同样的行为。我尝试修改两台机器的 .bashrc 文件以

如果 ![ $SSH_TTY ] ; 那么

导出 DISPLAY=localhost:0.0

但上述行为仍然存在(在这种情况下,远程服务器上会忽略 .bashrc 中的“export DISPLAY”行,并且 $DISPLAY 变量设置为 :0)。我也尝试过

如果 ![ $SSH_TTY ] ; 那么

导出 DISPLAY=localhost:0.0

别的

导出显示=本地主机:10.0

和这个偶尔可以正常工作,即远程运行的应用程序确实会显示在本地计算机的屏幕上。但是,大多数情况下,我都会收到错误消息

X11 连接由于错误的身份验证而被拒绝。qt.qpa.screen:QXcbConnection:无法连接到显示器 localhost:10.0 无法连接到任何 X 显示器。

有什么办法可以解决这个问题吗?如能得到任何帮助,我将不胜感激。提前谢谢您。

附加信息

  1. Windows 10 家庭版,版本 1909(1903 和 18XX 也出现同样的问题)。
  2. 无论使用“ssh -X”还是“ssh -Y”建立 ssh 会话,都会看到相同的行为。

答案1

if ! [ $SSH_TTY ] ; then
  export DISPLAY=localhost:0.0
fi

通常,转发 X 时不需要在远程系统上设置 DISPLAY 环境变量。如果您的 SSH 客户端和 ssh 服务器正在转发 X,则 SSH 服务器将为您初始化 DISPLAY 变量。如果您自己设置 DISPLAY,您可能会用不正确的值替换正确的值。您应该从 .bashrc 中删除设置 DISPLAY 的代码,或者至少避免在 SSH 服务器为您设置 DISPLAY 时覆盖 DISPLAY。

简单介绍一下背景知识:X 客户端通常通过 TCP 端口连接到 X 服务器。管理计算机自身显示器的 X 服务器通常使用默认的 TCP 端口 6000。正如您所指出的,当 SSH 转发 X 时,DISPLAY 将设置为类似“localhost:10.0”的内容,但数字可能不是 10。DISPLAY 设置的数字部分表示与端口 6000 的偏移量,因此“localhost:10.0”指的是端口 6010 上的 X 服务器。

偏移量 10 恰好是 OpenSSH SSH 服务器在转发 X 时使用的默认起始点。但它可以配置为使用不同的起始点,或者当您连接到服务器时端口 6010 可能正在使用中。因此,SSH 服务器可能会使用不同的端口,并且您的转发 X 连接最终可能会使用 localhost:11.0、localhost:12.0 甚至 localhost:100.0。

相关内容