我的 Raspberry Pi 3 B+ 上运行着一个实时应用程序,它会生成一个(非常大的)日志文件。为了让非技术人员下载它,我创建了一个用 Electron(NodeJs)编码的桌面应用程序。这个想法是列出网络的所有可用 IP 地址及其主机名,以允许非技术人员选择正确的 IP 地址并自动复制(通过 SFTP)其 PC 上的日志文件。SFTP 代码运行良好(感谢 nodejs 中的 ssh2 模块),但是,我可以识别我想要的 Raspberry。它们正确地从 DHCP 服务器获取 IP 地址,但我找不到获取其主机名的方法。下面是我的代码输出,列出了网络上可用的系统:
192.168.5.61 // err: { Error: getnameinfo ENOTFOUND 192.168.5.61
at GetNameInfoReqWrap.onlookupservice [as oncomplete] (dns.js:159:26)
errno: 'ENOTFOUND',
code: 'ENOTFOUND',
syscall: 'getnameinfo',
hostname: '192.168.5.61' }
192.168.5.61 // undefined // undefined
192.168.5.65 // USER-PC // ssh
192.168.5.62 // KM59CD4F // ssh
192.168.5.100 // server.blabla.com.au // ssh
如您所见,所有系统都返回了有效的主机名,除了我的系统报错。我的问题是,我可以在我的 Raspberry 上配置谁来发回有效的主机名? 我尝试使用 dhcpd.conf、dnsmasq.conf 和 hosts。完美的结果将与“192.168.5.65 // USER-PC // ssh”相同,其中 USER-PC 将成为我的系统主机名。
注意:当我在 /etc/hosts 中输入静态 IP 地址时,我的代码会检测到它并将正确的主机名发回给我。
答案1
您的扫描不会查询系统本身。它会查询路由器上的内部 DNS 服务器,该服务器会收集作为 DHCP 租约请求的一部分提供的主机名。
如果 Raspberry Pi 使用 DHCP 获取其 IP 地址,请确保 DHCP 客户端配置为发送“主机名”租约选项 (12)。某些路由器可能还接受“fqdn”选项 (81)。
- 对于 dhcpcd,将选项添加
hostname
到配置文件中。 - 对于 dhclient,将选项添加
send host-name = gethostname();
到配置文件中。(您也可以使用 . 指定自定义名称send host-name = "foo";
) - 对于 NetworkManager,请
ipv4.dhcp-send-hostname
在连接配置文件中启用。(某些版本可能需要ipv4.dhcp-hostname
手动设置为您想要的主机名。 - 对于 systemd-network,请确保 [DHCP] 部分已
SendHostname=
启用(默认)和Anonymize=
禁用(也是默认)。
如果 Raspberry Pi 使用静态 IP 配置,您还需要向路由器本身添加静态 DNS 条目。(映射名称 → 地址应该就足够了,路由器将添加反向映射。)
答案2
错误来自我公司的 DHCP 服务器。这是 Windows Server (2003) 的一个(非常)旧版本,我在较新的版本上进行了同样的测试,结果与预期一致。