如何让 mDNS(avahi)在适用于 Linux 的 Windows 子系统上运行?

如何让 mDNS(avahi)在适用于 Linux 的 Windows 子系统上运行?

我遵循了该主题中的最后一个例子:

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
  1. 直接在 WHILE 循环中执行 PING.EXE 会破坏我的循环,如果我不在子 shell 中执行,它会在第一次迭代后停止。注释掉 IP= 行会停止这种行为,因此肯定是那行破坏了循环。我不知道这是由执行 Windows 可执行文件引起的,还是将命令放在反引号之间而不是使用 $(command),或者是我还没有想到的其他原因。
  2. 每个 IP/主机占一行。一行中有两个具有相同 IP 的名称将不起作用。
  3. 当然,不包含“*.local”名称的 /etc/hosts 行将保持不变:)
  4. 未回复的主持人的线路保持不变。
  5. sudo因此sed你需要有那个权利来执行它。

-- 编辑:删除 grep 命令中 - 和 oP 之间的空格

相关内容