如何设置VcXSrv与WSL2配合使用

16
如何在Windows 10上设置VcXSrv.exe以与WSL2配合工作,而无需禁用访问控制?互联网上的每个说明都显示要禁用访问控制,但这将允许本地网络上的任何程序记录您的按键和鼠标移动等内容。

这在 Windows 11 上也可以正常工作,只需要进行一些微小的调整。 - nycynik
2个回答

30
与其禁用VcXSrv上的访问控制,您应该使用.Xauthority文件在X11客户端和VcXSrv X11服务器之间共享密钥。.Xauthority包含按DISPLAY索引的授权密钥集合。您需要为特定的Windows主机设置此文件并在VcXSrv和运行于WSL2发行版上的X11客户端之间共享该文件。要设置此项,请按照以下步骤操作:
运行您的WSL2发行版(假设这是基于Debian的)并安装xauth、md5sum和gawk或awk。我们还将安装一些X11客户端来测试我们的设置。在这种情况下,我们将安装gnome-terminal,但如果您想要其他内容,则可以安装其他内容。在Ubuntu发行版上,您可以执行以下操作:
sudo apt install -y xauth coreutils gawk gnome-terminal 
xauth list # this should be an empty list
magiccookie=$(echo '{some-pass-phrase}'|tr -d '\n\r'|md5sum|gawk '{print $1}')
xauth add host.docker.internal:0 . $magiccookie
cp ~/.Xauthority /mnt/c/Users/{WindowsUserName}

将以下内容添加到你的WSL2发行版主目录下的~/.bashrc文件中:

     export DISPLAY=host.docker.internal:0

我们需要创建一个XLaunch配置文件(即config.xlaunch)或一个带有所需命令行参数的VcXSrv.exe快捷方式。XLaunch是一个简单的启动器,可帮助设置参数并调用vcxsrv.exe。我们将忽略使用XLaunch,只需创建适当参数的自己的快捷方式。我们想要使用以下参数运行VcXSrv.exe:
vcxsrv.exe -multiwindow -clipboard -wgl -auth {.XAuthority file} -logfile {A Log file} -logverbose {int log level}

从上面的内容可以看出,我们将.Xauthority文件复制到了/mnt/c/Users/{WindowsUserName}/.Xauthority,因此我们想要执行的命令是:

vcxsrv.exe -multiwindow -clipboard -wgl -auth "c:\users\{WindowsUserName}\.Xauthority" -logfile "c:\users\{WindowsUserName}\VcXSrv.log" -logverbose 5

如果您没有遇到任何问题需要调试,可以自由省略日志文件和详细日志选项。因此您只需执行:

vcxsrv.exe -multiwindow -clipboard -wgl -auth "c:\users\{WindowsUserName}\.Xauthority"

请记得将{WindowsUserName}替换为c:\Users下您的文件夹名称。

要创建快捷方式,请导航到VcXSrv.exe安装的位置。默认位置为

C:\Program Files\VcXSrv\VcXSrv.exe

在资源管理器窗口中,右键单击VcXSrv.exe并单击“创建快捷方式”。这将在您的桌面上创建一个快捷方式。
右键单击创建的快捷方式图标,选择属性。
在快捷方式选项卡中,在可执行文件后附加上述参数。它应该看起来像:
"C:\Program Files\VcXSrv\VcXSrv.exe" -multiwindow -clipboard -wgl -auth "c:\users\{WindowsUserName}\.Xauthority"

在“属性”对话框的“常规”选项卡中,将名称更改为“VcXSrv with XAuthority”。
点击确定。
现在,您可以通过双击快捷方式来启动X11服务器。
如果您希望在启动时启动X11服务器,请按照此处的说明操作: https://support.microsoft.com/zh-cn/windows/%E5%9C%A8-windows-10-%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8%E5%BA%94%E7%94%A8-150da165-dcd9-7230-517b-cf3c295d89dd 现在回到WSL发行版终端,您应该能够运行gnome-terminal或其他X11客户端,并在运行在Windows主机上的VcXSrv X11服务器上以安全方式显示。
export DISPLAY=host.docker.internal:0
gnome-terminal

这将导致gnome-terminal在您的X11服务器上显示。此外,xauthority文件将被用于仅允许授权客户端连接到您的X11服务器。


3
我没有足够的声望点数来回答 https://dev59.com/dVIH5IYBdhLWcg3wH5X1?newreg=a1082ee992da4d62ac8ffc6e517c30ef - sfmontyo
1
发生了一些奇怪的事情。在重启和对我的系统进行一些升级之后,当我启动一个X程序时,出现了“需要授权,但没有指定授权协议”的提示,使我无法连接。当我运行 xauth list 时,我发现不再有一个条目为 host.docker.internal:0,而是一个条目为 $HOSTNAME:0(其中 $HOSTNAME 是我的PC名称)。我重新执行了从 xauth add ... 开始的步骤,现在它可以工作了。不确定它是如何发生的... - Fuhrmanator
非常感谢您的回答!对我来说,关键是不使用IP,而是使用host.docker.internal。@sfmontyo,您对这个答案的描述非常出色!真正节省了时间,特别是参数要求的分解,帮助我快速上手,并后来做出了快捷方式。谢谢! - nycynik
1
你可能想要将 export LIBGL_ALWAYS_INDIRECT=1 添加到 ~/.bashrc 中,以获得稍微更好的性能。 - Tolyandre
1
@ChrisCharabaruk 这是因为您没有安装Docker桌面版,可以使用以下命令代替:xauth add "$(grep "nameserver" /etc/resolv.conf | awk '{print $2}'):0" . $magiccookie' - airtonix
显示剩余4条评论

0

这对我有用;使用 wsl --update 更新 WSL,并使用 wsl --shutdown 重新启动 WSL,这将强制 WSL 重新启动,在更新后运行以下命令检查:

  • echo $DISPLAY 您将得到此值 :0
  • xhost + 您将看到

access control disabled, clients can connect from any host

如果您仍然遇到问题,请重新启动 Windows 并重试。 您可以通过 github trend 了解更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接