如何在 WSL2 上设置工作 X11 转发

How to set up working X11 forwarding on WSL2

从 WSL1 转移到 WSL2 时,很多事情都发生了变化;显然这也适用于 X11 转发。
我需要执行哪些步骤才能像使用 WSL1 一样在 Windows 10 上使用 X11 转发和 WSL2?

长话短说:

将以下内容添加到您的 ~/.bashrc

export DISPLAY=$(ip route list default | awk '{print }'):0
export LIBGL_ALWAYS_INDIRECT=1

在您的 X11 服务器上为 Windows 启用 Public 访问 。*

TCP 端口 6000 添加单独的 入站规则 到 windows 防火墙,以允许 WSL 访问X 服务器,如 wsl-windows-toolbar-launcher 人所述。


正如 by WSL_subreddit_mod on reddit and as you can read in Microsoft's documentation on WSL2 所指出的,WSL2 架构使用虚拟化网络组件。这意味着 WSL2 具有与主机不同的 IP 地址。 这就解释了为什么WSL1的X11转发设置不能简单的转移到WSL2。

在有关 WSL 的 Ubuntu Wiki 页面上,您已经可以在 Running Graphical Applications 下找到适用于 WSL2 的配置。上面提到的 Reddit 用户也提出了类似的配置,他还贡献了另一部分解决方案:Enable Public Access on the X11 server under Windows.

这意味着将以下内容添加到您的 ~/.bashrc:

export DISPLAY=$(ip route list default | awk '{print }'):0
export LIBGL_ALWAYS_INDIRECT=1

并且 在您的 X11 服务器上为 Windows 启用 Public 访问 。*

仍然缺少在 Windows 10 上为 WSL2 启用 X11 转发的最重要部分:Windows 防火墙默认阻止通过为 WSL 配置的网络接口进行连接。
TCP 端口 6000 的单独 入站规则 需要允许 WSL 访问 X 服务器。创建规则后,如 wsl-windows-toolbar-launcher 人所述,可以在新创建规则的设置中将 IP 地址范围限制为 WSL 子网,在 Scope 下: 172.16.0.0/12.

*:如果您使用 VcXSrv,您可以通过在额外设置中禁用访问控制来为您的 X 服务器启用 public 访问:

或者直接使用 ac 标志调用 vcxsrv.exevcxsrv.exe -ac 正如 ameeno 在 github 问题上指出的那样。

另外,this SO answer 展示了如何通过 .Xauthority 文件共享密钥,让您拥有完整的访问控制。

我不知道这是否特定于我的配置,但这些解决方案在我的计算机上不起作用。他们 return 地址 192.168.0.254 这是我的网关而不是我的主机。

为了让它工作,我必须在我的 Ubuntu/WSL2 上使用以下内容:

export DISPLAY="`ip -4 address | grep -A1 eth0 | grep inet | cut -d' ' -f6 | cut -d/ -f1`:0"

对于可能使用模拟引擎的人,例如ROS/Gazebo、Unity等,需要另外配置.

将这些添加到 ~/.bashrc

export DISPLAY=$(awk '/nameserver / {print ; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=0

请务必启用两者 Public 访问私人访问 windows 中的 X11 服务器。 同时禁用您的 X11 服务器支持的任何访问控制。

如果您使用 VcXSrv,请取消选中 Native opengl。 VcXSrv 的最终配置如下:

难度较小的替代优质 X11 服务器是 X410 and MobaXterm. For some details about this configuration refer here and here

使用 /etc/resolv.conf 名称服务器对我不起作用,因为我在 /etc/wsl.conf 中禁用了 resolv.conf 生成(我有自定义 resolv.conf)。

最终你想要WSL2主机IP地址,这也应该是你的默认路由。这是我的 Debian WSL2 发行版的 ~/.bashrc 条目:

export DISPLAY=$(ip route | awk '/^default/{print ; exit}'):0

对于像我这样只允许私人网络的人来说,

虽然他们应该都打勾

它应该在 Windows Defender 防火墙上有停止标​​志

双击它并允许私人连接和 public,

因此所有 4 项都应勾选绿色。

然后@NicolasBrauer 的上述回答对我有用。

喜欢在 XLaunch 和

时禁用访问控制
export DISPLAY=$(awk '/nameserver / {print ; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1

this github issue 复制了我的答案。

想法是利用通过 stdio 进行通信的能力。

先决条件

  • 为了我们可以在 Windows 主机中使用 socat,您需要一个发行版 运行ning WSL1。我相信你可以在 powershell 中做到这一点,但我没有时间研究这个。也许有人可以在 powershell 中编写一个 stdio->tcp 重定向器,那么我们就不需要有 2 个 WSL 发行版了。

如何转发X-server连接

  1. 在 Windows 上安装您最喜欢的 X 服务器 运行。默认情况下,他们会监听端口 6000。
  2. 在 WSL2 发行版中,运行 在后台执行以下命令(ubuntu 是安装了 socat 的 WSL1 发行版的名称):
mkdir -p /tmp/.X11-unix/
socat UNIX-LISTEN:/tmp/.X11-unix/X0,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d Ubuntu socat - TCP\:localhost\:6000"

基本上这会建立一条从普通 X unix 域套接字到主机端口 6000 的隧道。

如何将任何 TCP 连接转发回主机

假设在 Windows 上的端口 5555 上有一个 tcp 服务 运行ning。在 WSL2 发行版中,运行 在后台执行以下命令(ubuntu 是安装了 socat 的 WSL1 发行版的名称):

socat TCP-LISTEN:5555,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d ubuntu socat - TCP\:localhost\:5555"

如何将来自主机的任何 TCP 连接转发到 WSL2

这只是做同样的事情,只是方向相反。您可以在您的 WSL1 发行版中 运行 以下内容:

socat TCP-LISTEN:5555,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d ubuntuwsl2 socat - TCP\:localhost\:5555"

性能

在我的 PC 上,它可以处理高达 150MB/s 的数据,因此它不是最快的,但对于大多数应用程序来说已经足够快了。

我已经通过 Windows 主机的 LAN 适配器 IP 设法使用 out-of-the-box VcXsrv 防火墙配置(即不需要 override/disable 任何防火墙规则) .将以下内容添加到我的 ~/.bash_aliases

export DISPLAY=$(pwsh.exe -c ipconfig | grep -A 3 lan | grep IPv4 | head -1 | awk '{ print $NF }'):0

其中 lan 是我的 Connection-specific DNS 后缀(你的可能不同,在这种情况下你应该在上面的命令行中替换它)。

以下解决方法适用于我:

Set-NetFirewallProfile -Name $(Get-NetConnectionProfile).NetworkCategory -DisabledInterfaceAliases $(Get-NetAdapter | Where-Object Name -like 'WSL').Name

我使用以下bash设置显示:

export DISPLAY=$(powershell.exe -c ipconfig | grep -A4 WSL | tail -1 | awk '{ print $NF }' | tr -d '\r'):0

我宁愿在访客中设置一个 ssh 服务器, 在主机上安装 X11 服务器,如 Xming 并通过带有 X11 转发的 Putty 连接到本地主机。 无需修改防火墙规则,不需要主机 IP。

我发现Ubuntu有官方文档,很全面,供大家参考。正如我们所知,此技巧也适用于 Debian/WSL2。 https://wiki.ubuntu.com/WSL

感谢 Kennyhyun 和其他人的分享。所有这些都是在我的计算机上以某种方式或某种方式在 Windows10 上托管的 WSL2 上启用 X11 服务器。由于 WSL2 作为 VM 不再是与 WSL1 相同的基础架构。我确实花了一些时间来完成它。

请让我简单补充一下如何让 WSL2 上的应用程序显示出来。

  1. 运行 'ip route' 在 WLS2 终端上。

    IP路由 默认通过 a.b.c.1 dev eth0 a.b.c.0/20 dev eth0 proto 内核范围 link src x.x.x.x

  2. 将“dev eth0”的 IP 地址添加到“export $DISPLAY=”

    导出 $DISPLAY=a.b.c.1:0.0

  3. 运行 xming 服务器。 然后你可以 运行 WSL2 Linux 上 运行ning 的应用程序。但对于 X11,您可能需要遵循 Ubuntu.

    中的文档

我不确定为什么,但是 none 以上答案对我有用。我 运行 在配备 AMD 和 Nvidia 显卡的 ROG Zephyrus 上,我确定这会导致问题。

whme 描述的防火墙设置很重要,但 linux 环境变量对我不起作用。我在配置文件中有几个条目标记为名称服务器,但没有一个允许连接。

我最终将它们设置为:

export DISPLAY=$HOSTNAME:0.0
export LIBGL_ALWAYS_INDIRECT=

我正在使用 VcXsrv 作为 X-server。我还必须将参数设置为 -nowgl

我找到了一个适合我的解决方案,如下所示: 在 WSL2 上设置图形

1.      Start ssh service
1.1.   Open WSL
1.2.   Type: sudo service ssh start
2.      Get Windows (WSL net) IP
2.1.   Open Powershell
2.2.   Type: (ipconfig | Select-String -Pattern 'WSL' -Context 1, 5).Context.PostContext | Select-String -Pattern 'IPv4'
2.3.   Get the received IP
3.      Set environment variable
3.1.   In WSL2 terminal type: export DISPLAY=172.23.64.1:0.0 with the IP of the windows entity (2.3) instead of the place holder
4.      Launch Xming
4.1.   Open Xlaunch and go with the defaults In Specify parameter settings: Check No Access Control
5.      Good luck!

正在关注 link: https://docs.google.com/document/d/1ao3vjbC3lCDc9kvybOT5PbuGhC4_k4g8LCjxX23VX7E

来自 https://github.com/microsoft/WSL/issues/4793#issuecomment-588321333 的解决方案使用 VcXsrv 作为 X 服务器,这是我得到这个答案的地方(为了便于阅读而略微编辑)。请注意,原文作者正在更新中,所以不要忘记重新检查。

To make it work:

  1. On Windows, with the following, change E:\VcXsrv to where your installation is, and save it as xxx.bat in your Windows startup folder, e.g., C:\Users\Me\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, and you can make it run when boot if you like:
@ECHO OFF

REM Start WSL once to create WSL network interface
wsl exit

REM Find IP for WSL network interface
SET WSL_IF_IP=
CALL :GetIp "vEthernet (WSL)" WSL_IF_IP
ECHO WSL_IF_IP=%WSL_IF_IP%
setx "WSL_IF_IP" "%WSL_IF_IP%"
setx "WSLENV" "WSL_IF_IP/u"

REM Change E:\VcXsrv to your VcXsrv installation folder
START /D "E:\VcXsrv" /B vcxsrv.exe -multiwindow -clipboard -nowgl -ac -displayfd 720
GOTO :EOF



:GetIp ( aInterface , aIp )
(
    SETLOCAL EnableExtensions EnableDelayedExpansion
    FOR /f "tokens=3 delims=: " %%i IN ('netsh interface ip show address "%~1" ^| findstr IP') DO (
        SET RET=%%i
    )
)
(
    ENDLOCAL
    SET "%~2=%RET%"
    EXIT /B
)
  1. In WSL, edit ~/.bashrc file to add following lines:
export DISPLAY=$WSL_IF_IP:0
unset LIBGL_ALWAYS_INDIRECT

That's all to make WSL2 work automatically. The idea is to get the private LAN IP of WSL interface on Windows, and use Environment variable to pass it to WSL. WSL then updates this LAN IP to DISPLAY for X-Server connection.

剪贴板也适用于此设置。我用 Ubuntu 20.04 LTS 的 WSL2 安装测试了这个。

这是我写的两篇文章,介绍了为不同类型的用例设置 x11:

  1. Install a Program With a Graphical User Interface in WSL2:本文介绍了安装 vcxsrv、将环境变量添加到 bashrc 配置文件,以及以编程方式安排 vcxsrv 在启动时使用命令行参数启动。它还包括在 WSL2 中将 Firefox 作为独立程序安装和启动。
  2. Install Ubuntu Desktop with a Graphical User Interface in WSL2 本文介绍了如何安装 vcxsrv、dotNet、genie 和 Ubuntu 桌面。它包括创建导出环境变量的脚本、启动 vcxsrv、启动 gnome 桌面环境,以及创建将它们联系在一起的快捷方式。它还涵盖了 运行 Ubuntu 桌面、防止屏幕锁定错误以及安装 Snap Store。

如何在 WSL2 中设置 X11 转发

此答案假定您已经在 Windows 主机上使用了 XServer 和 PulseAudio 配置 运行ning,因为您已经在使用 WSL1。 (您可能还必须将 -ac 参数添加到命令行以使您选择的 XServer 与 WSL2 一起工作。)

我这样做的方式,并确保无论我在 Windows 主机上使用静态 IP 地址还是 DHCP,甚至我的主机名或网络位置是否发生变化,我都能获得 X11 转发,我将以下内容添加到我的 ~/.bashrc 文件中:

# Get the IP Address of the Windows 10 Host and use it in Environment.
HOST_IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r')
export LIBGL_ALWAYS_INDIRECT=1
export DISPLAY=$HOST_IP:0.0
export NO_AT_BRIDGE=1
export PULSE_SERVER=tcp:$HOST_IP

完成上述操作后,无论我的 Hostname 或 Host 的 IP 地址是什么,每次在 WSL2 中启动 BASH 会话时,它都会被放置在环境中。通过命令行 运行ning firefox 测试它并观看 YouTube 视频。您应该能够听到声音并看到应用程序本身来观看视频。另外通过从命令行启动其他 GUI 应用程序进行测试。

它的作用:它使用主机命令从输出中提取与主机名关联的 IPv4 地址,greps 与包含您的 Windows 主机 IPv4 地址的行相匹配的地址,去除其余部分IP 地址以外的信息,然后 awks 并将其打印到变量中,并修剪输出。然后,这用于提供必要的 IP 地址作为字符串,以便在允许转发 X11 和声音输出的环境变量中使用。

如果其他方法对您不起作用(因为它们对我不起作用),希望它对您有用。

大多数 CLI 应用程序可以 运行 来自 BASH 提示符或 Windows 终端。如果你想创建一个快捷方式,大多数 CLI 应用程序都可以像以下任一示例一样设置(在这种情况下不需要 X11 转发,除了像 Links2 这样的应用程序):

C:\Windows\System32\wsl.exe -e htop
C:\Windows\System32\wsl.exe lynx

如果您想为 Linux GUI 应用程序创建桌面快捷方式,除非您可以在启动程序之前从您的 ~/.bashrc 文件中获取要使用的环境变量,否则您必须使用以下命令创建快捷方式以下模板,并将程序名称放在 {yourprogram} 的位置:

C:\Windows\System32\wsl.exe LIBGL_ALWAYS_INDIRECT=Yes IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') DISPLAY=$IP:0.0 PULSE_SERVER=tcp:$IP {yourprogram}

您不必为许多程序放置完整的命令行。对于基于 PERL 的程序或基于 Python 的程序,您有时必须将 PERL 和 PYTHON 的路径以及程序的完整路径添加到 运行 中的此类 GUI 程序Linux 使用 WSL2。对于我的一个 perl 程序,我必须这样做:

C:\Windows\System32\wsl.exe IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') ; export LIBGL_ALWAYS_INDIRECT=Yes export DISPLAY=$IP:0.0 ; cd /mnt/c/Users/{yourusername}/Desktop ; /usr/bin/perl ~/wget-gui.pl

您可能需要进行一些试验才能使某些应用程序正常运行。例如,您可能需要 dbus-launch 应用程序,并且需要将该命令添加到程序名称之前的快捷方式。

C:\Windows\System32\wsl.exe LIBGL_ALWAYS_INDIRECT=Yes IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') DISPLAY=$IP:0.0 PULSE_SERVER=tcp:$IP dbus-launch --exit-with-session gedit

并且在某些情况下您可能不得不使用更短的变量名。有些应用程序根本无法正常运行,但这种情况会随着时间的推移而改善。另外,不要尝试从 Windows 命令提示符或 PowerShell 中 运行 以上内容。它会抛出有关 'grep' 未被识别为内部或外部命令等错误

以下是一些 Linux GUI 应用程序 运行ning 在我的 Windows 10 系统上的屏幕截图,在 WSL2 上使用 X11 转发。

您可以在不禁用服务器上的访问控制的情况下连接到 X 服务器。您在服务器上使用 xauth 生成一个 cookie,然后将其加载到 Linux 中,在 Linux 端使用 xauth。您可以从 /etc/resolv.conf 获取服务器 IP。以下是我的.bashrc:

k=$('/mnt/c/Program Files/VcXsrv/xauth.exe' -f 'C:\Users\xxx\Documents\scratch.xauth' -i -n -q 2>/dev/null <<EOF
generate localhost:0 . trusted timeout 604800
list
quit
EOF
)
if [ -n "$k" ]
then
        export DISPLAY=$(sed '/^nameserver/ {s/^nameserver\s\s*\([0-9][0-9.]*\)[^0-9.]*$//;p;};d' /etc/resolv.conf):0
        xauth -q add $DISPLAY . ${k##* }
        export LIBGL_ALWAYS_INDIRECT=true
fi
unset k

我不想干扰 public 对 X 服务器和 Windows 防火墙的访问。我的解决方案是使用带有 X 转发的 ssh(也适用于 VirtualBox)。此外,WSL 自动从主机转发到来宾侦听套接字,因此我不关心实际分配给来宾的 IP。

步骤如下:

  1. 安装 VcXSrv。 运行 它具有所有默认值,但将显示编号设置为 0(如果没有 X 实例已经 运行ning,-1 将选择 0)。不要在其中启动任何客户端(这样做的好处是您可以在同一个 X 服务器实例上启动更多应用程序)。
  2. 打开WSL并配置ssh服务器。对我来说,它就像 sudo service ssh start 一样简单。使用命令行创建 Windows 快捷方式:wsl sudo service ssh start.
  3. 为 Windows 安装 Git。我实际上使用它只是因为它的 ssh 版本能够使用 ssh -f 进入后台。 Windows 版本的 ssh 在此功能上存在错误,否则不进入后台或使用 ssh -n.
  4. 是合适的
  5. 配置从 Git-Bash 到访客的无密码登录。 ssh user@127.0.0.1 此时应该可以工作,因为主机端口已转发给来宾。
  6. 验证来自 Git-Bash 的 X 转发有效:DISPLAY=127.0.0.1:0 ssh -Y user@127.0.0.1 xeyes。我认为 xeyes 是随每个 X 发行版一起安装的。
  7. 在 WSL 中安装您选择的文件管理器或终端。例如,pcmanfm。创建 Windows 快捷方式:"C:\Program Files\Git\git-bash.exe" -c "DISPLAY=127.0.0.1:0 ssh -Y -f user@127.0.0.1 'bash -l -c pcmanfm >/dev/null 2>&1'"。这里 bash -l 标志有助于设置环境,这可能重要也可能不重要,具体取决于您 运行.

当然,我可以在没有 git-bash 的情况下使用 VcXSrv 内置 ssh 客户端来做同样的事情,但它需要将 ssh 密钥转换为 PuTTY 格式,我有 git -bash 已经安装。此外,内置客户端显示重用对我不起作用。

正如其他人指出的那样,我在 windows 10 上提出了一个使用 vxcsrv 的解决方案。

XServer Windows - WSL1 和 WSL2:

安装 X-Server Windows

https://sourceforge.net/projects/vcxsrv/

在 WSL Distro 中设置显示向前

配置显示:

  • 如果你运行 WSL1:
export LIBGL_ALWAYS_INDIRECT=1
export DISPLAY=localhost:0
  • 如果你运行WSL2:
export LIBGL_ALWAYS_INDIRECT=1
export DISPLAY=$(awk '/nameserver / {print ; exit}' /etc/resolv.conf 2>/dev/null):0
  • (如果您已禁用 resolv.conf,请使用此定义:

然后(安装 x11-apps)

sudo apt update
sudo apt install x11-apps

在 Windows

上启动 XLaunch
  • 多个Windows
  • 不启动客户端
  • 禁用本机 opengl
  • 启用禁用访问控制

测试一下

在 wsl 中:输入 xcalc - 计算器应在 Windows10

后打开

如果一切正常

并且您想将设置保留在您的 wsl 发行版中。将它们存储在您的 ~/.bashrc.

sudo nano ~/.bashrc

复制两行(来自WSL Distro 中的Set Display forward - Configure Display),最后保存。

将其添加到自动启动

  1. 运行 对话框参见 Windows
  2. 上的启动 XLaunch
  3. 保存配置
  4. 按Windows + R
  5. 输入:shell:startup
  6. 复制保存的配置:*.launch(在第 2 步中生成)到此文件夹(第 4 步)

现在 XServer 将在 windows 启动时启动。

我正在将它用于 ROS。适合我。

我的 XServer 无法通过 Internet 访问,因此可以禁用访问控制。

我的错误是我使用了我的 linux wsl2 实例的名称服务器,而我的 xserver 在 windows 上运行。 因此必须将 DISPLAY 变量设置为我的 windows ipv4 地址。 只需在 powershell 或 cmd 中键入 ipconfig 并使用 ipv4 ethernet address.

从WSL打开X11 GUI我也遇到了困难。

我在检测正确的 IP 时遇到问题,有时 X11 服务器会出现奇怪的偏移量,有时会随机出现在 0-17 上。

我编写了以下脚本来自动处理这个问题,但它几乎没有依赖项:

  • 已在 CentOS7 镜像
  • 下测试并运行
  • 在您的 linux 发行版上安装 X11-apps 以设置 `xset
  • 安装“超时”应用程序
  • source ./find_display_ip.sh 执行脚本。注意来源!您需要在 运行ning shell.
  • 上安装 DISPLAY 环境变量
  • 运行 脚本只能通过“Windows 终端”或 WSL shell 中包含 windows“PATH”的东西。例如,在 windows 提示 `cmd 中,这对我来说不是默认的。
  • 显然要确保您的 X11 服务器具有完全访问权限(“xhost +”或“X11 远程访问”已满)

事不宜迟,这是脚本源代码:

#!/bin/bash

start_index=
start=${start_index:-0}
# check current settings
declare -i stop=0
if [ ! -z "$DISPLAY" ]; then
    timeout 1s xset -display $DISPLAY q &> /dev/null;
    [[ "$?" -eq 0 ]] && echo "Already Set to $DISPLAY" && stop=1;
fi

# scan displays 0-17
for port in $(seq $start 17);
do
    [[ 1 -eq $stop ]] && break;
    grp="ipconfig.exe | grep IPv4 | tr -d '5' | sed 's#.*: \(.*\)$#:${port}.0#;'"
    for ipd in $(eval $grp)
    do
        echo Trying $ipd;
        timeout 1s xset -display $ipd q &> /dev/null;

        # command was sucessful
        [[ "$?" -eq 0 ]] && export DISPLAY=$ipd && echo $ipd was set && stop=1;

        ##echo "Trying next IP...";
    done
done

Windows 11Insider 构建 Windows 10,截至 2021-04-27,包括 WSLg。它 正常工作 ™。

注意:目前,所有支持 WSLg 的 Windows 版本都是 Insider 版本,它们是通常不建议日常使用。但是,“WSLg 将与即将发布的 Windows 一起普遍可用”。

来自 https://github.com/microsoft/wslg (original announcement).

Prerequisites:

  1. Ensure using Windows 10 Insider build 21362+
  2. Recommended: Install driver for vGPU: Intel AMD Nvidia

“系统信息”应用程序会告诉您当前的内部版本号。

WSL1 is not compatible with WSLg。新的 WSL2 实例将 正常工作™。

现有的 WSL2 系统需要“更新”:

  1. In administrative PowerShell: wsl --update
  2. wsl --shutdown to force a restart of the WSL

不要忘记删除您可能对 DISPLAY 所做的任何其他修改。

有效证明:

虽然官方公告说 Insider 构建的 Windows 10 支持 WSLg,在Windows10上演示,目前好像没有公开的Insider Windows 10 版本支持 WSLg.

2021 年对 Windows 10

的回答

如果从 resolv.conf 获取 IP 不起作用,请检查此答案。

在您的 WSL2 中使用以下命令找到您的 Windows IP 地址(是的,linux 中的 .exe 文件):

ipconfig.exe 

使用下面的命令设置显示(填写YOUR_IP_ADDRESS您的IP):

export DISPLAY=YOUR_IP_ADDRESS:0

检查您的 GUI 应用程序是否正常工作。

每种情况下的自动化可能略有不同,但我举个例子:

ipconfig.exe | grep 'IPv4 Address' | grep '10\.' | cut -d ":" -f 2 | cut -d " " -f 2 

说明:我找到了所有 IPv4 地址(在我的例子中是 3 个 IP)。我知道我的 IP 仅从“10”开始。所以我使用第二个 grep 选择了这一行。接下来我处理整行以仅获取 IP。