这是逆转这个问题。奇怪的是,我找不到有人想要连接到远程机器的情况从他们的 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.com
Windows 机器和 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 的功能更加丰富和强大,缺点较少。
您将找到大量有关转换的说明,但一般步骤如下:
使用以下命令备份现有的 WSL 发行版(如果很重要):
wsl --export <distro_name> <path/to/backup.tar>
然后转换:
wsl --set-version <distro_name> 2