如何从 WSL 连接到本地机器?

如何从 WSL 连接到本地机器?

这是逆转这个问题。奇怪的是,我找不到有人想要连接到远程机器的情况他们的 WSL 实例。

就我而言,我有一台 Raspberry Pi,其主机名是rasppi.local,并且我正尝试通过我的 WSL Ubuntu 实例通过 SSH 进入它,但出现“名称解析暂时失败”的问题。

到目前为止已尝试过的:

  • ssh [email protected]从托管 WSL 的 Windows 机器上工作正常(Powershell);
  • ssh [email protected]从 Windows 机器上的 WSL 失败(Ubuntu);
  • ssh username@<rasppi IP>从 Windows 机器和 WSL 都可以工作;
  • ping <rasppi IP>从 Windows 机器和 WSL 工作并且所有数据包都被检索而没有任何丢失;
  • ping superuser.comWindows 机器和 WSL 都可以工作。

输出ssh [email protected] -vvv

WSL 中的输出如下:ssh [email protected] -vvv

OpenSSH_8.2p1 Ubuntu-4ubuntu0.5, OpenSSL 1.1.1f  31 Mar 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug2: resolving "rasppi.local" port 22
ssh: Could not resolve hostname rasppi.local: Name or service not known

输出ping superuser.com

在 Windows Powershell 中:

PING superuser.com [151.101.129.69] 32 bytes of data:
Response from 151.101.129.69: bytes=32 time=6ms TTL=54

在 WSL 中:

PING superuser.com (151.101.129.69) 56(84) bytes of data.
64 bytes from 151.101.129.69 (151.101.129.69): icmp_seq=1 ttl=54 time=5.59 ms

输出ip addr

在 WSL 中:

21: eth0: <> mtu 1500 group default qlen 1
    link/ether 02:50:f2:69:1d:00
20: eth1: <> mtu 1500 group default qlen 1
    link/ether 34:73:5a:e0:07:3f
    inet 169.254.28.69/16 brd 169.254.255.255 scope global dynamic
       valid_lft forever preferred_lft forever
    inet6 fe80::b2ff:c07f:aa77:2b0b/64 scope link dynamic
       valid_lft forever preferred_lft forever
1: lo: <LOOPBACK,UP> mtu 1500 group default qlen 1
    link/loopback 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope global dynamic
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host dynamic
       valid_lft forever preferred_lft forever
9: wifi0: <BROADCAST,MULTICAST,UP> mtu 1500 group default qlen 1
    link/ieee802.11 00:d7:6d:09:8c:7e
    inet 192.168.0.22/24 brd 192.168.0.255 scope global dynamic
       valid_lft 2853sec preferred_lft 2853sec
    inet6 2804:14c:1d9:870e:65ac:2928:291f:6c96/64 scope global dynamic
       valid_lft 86283sec preferred_lft 71883sec
    inet6 2804:14c:1d9:870e:6415:bdaa:71ef:128e/128 scope global dynamic
       valid_lft 86283sec preferred_lft 71883sec
    inet6 fe80::7a77:b29:df4a:a9c5/64 scope link dynamic
       valid_lft forever preferred_lft forever
11: wifi1: <> mtu 1500 group default qlen 1
    link/ieee802.11 00:d7:6d:09:8c:7f
    inet 169.254.41.240/16 brd 169.254.255.255 scope global dynamic
       valid_lft forever preferred_lft forever
    inet6 fe80::d936:f662:1d15:c5ad/64 scope link dynamic
       valid_lft forever preferred_lft forever
10: wifi2: <> mtu 1500 group default qlen 1
    link/ieee802.11 02:d7:6d:09:8c:7e
    inet 169.254.0.167/16 brd 169.254.255.255 scope global dynamic
       valid_lft forever preferred_lft forever
    inet6 fe80::84fb:86e5:80a3:cf38/64 scope link dynamic
       valid_lft forever preferred_lft forever

输出route

在 WSL 中:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
127.0.0.0       0.0.0.0         255.0.0.0       U     256    0        0 lo
127.0.0.1       0.0.0.0         255.255.255.255 U     256    0        0 lo
127.255.255.255 0.0.0.0         255.255.255.255 U     256    0        0 lo
224.0.0.0       0.0.0.0         240.0.0.0       U     256    0        0 lo
255.255.255.255 0.0.0.0         255.255.255.255 U     256    0        0 lo
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 wifi0
192.168.0.22    0.0.0.0         255.255.255.255 U     256    0        0 wifi0
192.168.0.255   0.0.0.0         255.255.255.255 U     256    0        0 wifi0
224.0.0.0       0.0.0.0         240.0.0.0       U     256    0        0 wifi0
255.255.255.255 199.262.0.1     255.255.255.255 U     0      0        0 wifi0
0.0.0.0         199.262.0.1     255.255.255.255 U     0      0        0 wifi0

请注意,在 Powershell 和 WSL 中都可以直接 ping Raspberry Pi IP,因此它很可能是 WSL 内的 SSH 配置。

为了使用主机名进行连接,这里缺少什么rasppi.local


如果相关的话,我正在尝试建立一个任务服务器客户端位于 WSL 实例中,而服务器仍位于 Raspberry Pi 中。我可以直接在 Pi 中将其设置为客户端,然后通过 Powershell 上的 SSH 进行访问,但考虑到 Pi 仅应用作服务器,这似乎不是最佳选择。如果有人不这么认为,我将不胜感激,因为这是我第一次处理网络和服务器。

答案1

为了使用主机名进行连接,这里缺少什么rasppi.local

您已确认使用 IP 地址有效,正如我所料。因此,正如@SeñorCMasMas 在评论中提到的那样,这似乎纯粹是一个名称解析问题。

此外,正如@GordonDavisson 在评论中提到的,该.local域名表示正在使用 mDNS,而不是 DNS。

旁注/替代方案 1:如果您遇到以下任何问题,最好的解决方法是将 Pi 设置为具有固定 IP 地址,并在 WSL 发行版的/etc/hosts文件中对该地址进行硬编码。或者直接通过该 IP 地址访问它。

话虽如此,mDNS 支持已在 WSL2 中存在多年了,我无法想象目前仍受支持的 Windows 版本不会将其包含在已安装的 WSL2 版本中。

然而,WSL1 确实不是支持 mDNS。因此,很自然地,我的第一个猜测您使用的是 WSL1 而不是 WSL2。您可以使用以下方法检查:

wsl.exe -l -v

如果您的 WSL 发行版显示它正在作为 WSL1 运行,那么rasppi.local(或任何其他.local发行版都无法解决)。另一方面,如果它显示 WSL2,那么请更新问题,我会再仔细思考一下。

作为一种解决方法(适用于 WSL1 或 WSL2),您可以使用 PowerShell 查找 IP 地址,因为您已经说过 mDNS 解析在那里有效。以下操作在 WSL1 上的 Ubuntu 20.04 上的 Bash 上对我有效:

> rasppi=$(pwsh.exe -c '([System.Net.Dns]::GetHostAddresses("rasppi.local","InterNetwork")).IPAddressToString' | tr -d '\r')
> echo $rasppi
# Should see IP
> ssh $rasppi
# Should "resolve"

假设您已安装 PowerShell Core ('pwsh.exe')。如果您有 Windows PowerShell ('powershell.exe'),语法似乎会有所不同,我还没有解决这个问题。

考虑到有关在 WSL 中运行 Taskserver 客户端的说明,您需要以某种方式更新 Taskserver 配置以使用该环境变量,或者根据

或者,如果您发现您正在运行 WSL1,并且您的系统支持 WSL2,则可以转换为该发行版。总体而言,与 WSL1 相比,WSL2 的功能更加丰富和强大,缺点较少。

您将找到大量有关转换的说明,但一般步骤如下:

  1. 使用以下命令备份现有的 WSL 发行版(如果很重要):

    wsl --export <distro_name> <path/to/backup.tar>
    
  2. 然后转换:

    wsl --set-version <distro_name> 2
    

相关内容