背景
我有一个设备通过以太网插入我的 Windows PC。该设备正在运行 mDNS 服务并拥有自己的主机名 ( gp800-49d1a
)。
从 WSL 中,我可以ping gp800-49d1a
成功,并且可以nslookup gp800-49d1a
得到以下结果:
Server: 172.30.176.1
Address: 172.30.176.1#53
Non-authoritative answer:
Name: gp800-49d1a.local
Address: 169.254.93.130
Name: gp800-49d1a.local
Address: fe80::e700:63f:1807:adf2
我可以得到IP地址169.254.93.130
。可以通过该地址进行连接。到目前为止一切都是正确的。
问题
当我nslookup gp800-49d1a
从 Windows 命令提示符运行时,得到以下结果:
Server: dns.google
Address: 8.8.8.8
*** dns.google can't find gp800-49d1a: Non-existent domain
当我ping gp800-49d1a
从 Windows 命令提示符运行时,它工作正常。
因此,出于某种原因,WSL 中的 nslookup 可以,但 Windows 中的 nslookup 不行。
附加信息
我可以使用主机名从 Google Chrome 访问我的设备。Chrome 和 WSL 似乎都知道如何查找 mDNS 条目,但 Windows 命令提示符中的 nslookup 不知道。
问题
由于 nslookup 无法从 Windows 命令提示符找到我的设备,我还可以使用什么方法从 Windows 获取我的设备的 IP 地址?
nslookup
是专门的 DNS 客户端,不是 mDNS 客户端,也不是通用主机名查找工具。它完全忽略操作系统拥有的整个“主机名查找”系统,而是手动将 DNS 数据包发送到一台服务器(它在操作系统提供的列表中找到的第一台服务器)。它在 WSL 中工作的唯一原因是因为您正在与 Windows 主机上运行的 DNS 服务(“Dnscache”)通信,然后该服务将查询代理到它支持的所有机制(包括 Windows 上由“Dnscache”处理的 mDNS) 。
然而,即使在这种情况下,Linux nslookup仍然绕过正常的 Linux 主机名查找,而是手动执行 DNS,并且它仍然认为它只与它在 /etc/resolv.conf 中找到的一个特定服务器进行单播 DNS 对话 – 它只会发生该服务器在 nslookup 不知情的情况下执行此转换。
然而,当您直接在 Windows 上运行它时,这种情况不会发生 – nslookup 与 8.8.8.8 的 DNS 服务器通信,而该服务器不知道您的 .local mDNS 主机名。
正如u1686_grawity 的回答中提到的,Windows 命令提示符中的 nslookup 不适用于 mDNS。
要获取设备的 IP 地址,您可以使用 PowerShell 命令
Resolve-DnsName <hostname>
。