我有一台 Raspberry Pi (raspbian jessie),其 ssh 和 vnc 服务已在 avahi 中注册。我可以在我的客户端 (chromebook) 中看到这两项服务
chronos@localhost ~ $ avahi-browse -arl
+ mlan0 IPv4 raspberrypi SSH _ssh._tcp local
+ mlan0 IPv4 raspberrypi VNC _rfb._tcp local
+ mlan0 IPv4 raspberrypi [30:b5:c2:1e:2f:df] _workstation._tcp local
= mlan0 IPv4 raspberrypi SSH _ssh._tcp local
hostname = [raspberrypi.local]
address = [192.168.1.200]
port = [22]
txt = []
= mlan0 IPv4 raspberrypi [30:b5:c2:1e:2f:df] _workstation._tcp local
hostname = [raspberrypi.local]
address = [192.168.1.200]
port = [9]
txt = []
= mlan0 IPv4 raspberrypi VNC _rfb._tcp local
hostname = [raspberrypi.local]
address = [192.168.1.200]
port = [5900]
txt = []
看来我可以解析名称和地址:
chronos@localhost ~ $ avahi-resolve --address 192.168.1.200
192.168.1.200 raspberrypi.local
chronos@localhost ~ $ avahi-resolve --name raspberrypi.local
raspberrypi.local 192.168.1.200
但每当我尝试从我的 chromebook ping 或 ssh raspberry 时,它都无法解决:
chronos@localhost ~ $ ping raspberrypi.local
ping: unknown host raspberrypi.local
chronos@localhost ~ $ ssh [email protected]
ssh: Could not resolve hostname raspberrypi.local: Name or service not known
我是不是漏掉了什么?实际上,我可以从本地网络中的另一个客户端 (Arch Linux) ssh 我的 Raspberry Pi,所以我猜问题应该出在 Chromebook 方面。
这是我在 Raspberry Pi 中使用的服务定义 (/etc/avahi/services/ssh.service):
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h SSH</name>
<service>
<type>_ssh._tcp</type>
<port>22</port>
</service>
</service-group>
答案1
Avahi 在局域网上寻找 Avahi 服务,并查询它们(在您的示例中)显示 IP 解析。
使用 chromebook 上的 IP 地址将获得您想要的结果(ping 回复或 ssh 访问)。
大多数网络不存储机器名称,只存储 IP。您可以/etc/hosts
通过添加以下行来提供自己的域名查找(用于静态 IP 地址)(chromebook 必须处于开发者模式):
raspberrypi.local 192.168.1.200
或者通过在脚本中自动执行,使用命令的sed
输出替换以 开头的行。这将适用于动态 IP 分配,但您仍然需要在每次启动 RPi 时至少运行一次脚本(以防它发生变化)。raspberrypi.local
avahi-resolve --name raspberrypi.local
您没有得到期望结果的原因是域名服务(或 DNS 服务器)不知道 LAN 地址名称。
以下方法同样有效:
ping `avahi-resolve --name raspberrypi.local`
ssh `avahi-resolve --name raspberrypi.local`
` 位于波浪键 (~)
答案2
*.local
支持 avahi名称查找的正常方式ping raspberrypi.local
是通过mdns4_minimal
例如/etc/nsswitch.conf
在
如何在 Ubuntu 16.10 中配置本地 DNS 查找? - 询问 Ubuntu
修复此错误后,Chrome OS 似乎可以实现这一点:199397 - FR:mDNS 名称解析 - chromium - Monorail,但在某些使用自己的非 mdns 域的网络上遇到了问题.local
,如所述 626377 - 启用 mDNS 主机名解析而不破坏 .local 单播 DNS - chromium - Monorail。
截至 2018 年初,问题 626377 似乎即将发布,以重新启用 mdns 查找。
与此同时,我猜想如果您进入开发人员模式并更改 rootfs 分区,则可以在本地修复此问题。在此之前,Paul Wratt 的回答有一些有用的解决方法。