![如何让 mDNS(avahi)在适用于 Linux 的 Windows 子系统上运行?](https://linux22.com/image/1544618/%E5%A6%82%E4%BD%95%E8%AE%A9%20mDNS%EF%BC%88avahi%EF%BC%89%E5%9C%A8%E9%80%82%E7%94%A8%E4%BA%8E%20Linux%20%E7%9A%84%20Windows%20%E5%AD%90%E7%B3%BB%E7%BB%9F%E4%B8%8A%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
我遵循了该主题中的最后一个例子:
https://github.com/Microsoft/WSL/issues/384
换句话说:
~$ sudo service dbus start
* Starting system message bus dbus [ OK ]
~$ sudo service avahi-daemon start
* Starting Avahi mDNS/DNS-SD Daemon avahi-daemon [ OK ]
~$ avahi-resolve --name rpi.local
Failed to resolve host name 'rpi.local': Timeout reached
这是在安装列出的软件包后完成的在这个答案中。
rpi.local
可以通过Windows解决。
Windows 10 版本 10.0.16299 内部版本 16299
~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial
答案1
这不是一个解决方案,而是一个解决方法(针对 WSL2)。
这不仅仅是 MDNS 无法正常工作,真正的问题是 WSL2 在其自己的虚拟网络上通过 NAT 连接到您的物理网络,而 MDNS 无法通过。是实际上在最新版本中可以工作,但仅限于主机名称。我也一直在诅咒这个。
我将经常需要的所有 mDNS 名称都包含在 WSL 的 /etc/hosts 中,并创建了此脚本以使用 Windows 名称解析来更新它们。
#!/bin/bash
grep -oP "[0-9.]*\s\K[A-Za-z0-9.-]+\.local" /etc/hosts | while read HOSTNAME
do
echo -n "Pinging $HOSTNAME... "
# Executing windows command without subshell breaks DO loop.
IP=`echo "/mnt/c/Windows/System32/PING.EXE -4 -n 1 $HOSTNAME | grep -oP \"Reply from \K[0-9.-]+\"" | bash`
echo $IP
[ -z $IP ] || sudo sed -i "s/.*$HOSTNAME.*/$IP $HOSTNAME/" /etc/hosts
done
echo ====== Result in /etc/hosts
grep -P "[0-9.]*\s[A-Za-z0-9.-]+\.local" /etc/hosts
- 直接在 WHILE 循环中执行 PING.EXE 会破坏我的循环,如果我不在子 shell 中执行,它会在第一次迭代后停止。注释掉 IP= 行会停止这种行为,因此肯定是那行破坏了循环。我不知道这是由执行 Windows 可执行文件引起的,还是将命令放在反引号之间而不是使用 $(command),或者是我还没有想到的其他原因。
- 每个 IP/主机占一行。一行中有两个具有相同 IP 的名称将不起作用。
- 当然,不包含“*.local”名称的 /etc/hosts 行将保持不变:)
- 未回复的主持人的线路保持不变。
sudo
因此sed
你需要有那个权利来执行它。
-- 编辑:删除 grep 命令中 - 和 oP 之间的空格