我在查看 LAN 中设备的主机名时遇到问题。在我的第一台笔记本电脑(Ubuntu 18.04 LTS 桌面版)上,以下命令的结果:
arp -a
正是我想要的:
X (192.168.56.243) at 40:a3:cc:99:2d:66 [ether] on wlan0
test-test-test (192.168.56.146) at 48:bf:6b:e3:bf:5a [ether] on wlan0
TP-Link_Archer_ (192.168.56.1) at 10:7b:44:40:61:70 [ether] on wlan0
使用地图,我可以使用以下命令扫描我的 LAN:
nmap -sn 192.168.56.0/24
我用主机名得到了完美的结果:
Starting Nmap 7.60 ( https://nmap.org ) at 2018-08-07 09:07 EDT
Nmap scan report for TP-Link_Archer_ (192.168.56.1)
Host is up (0.0054s latency).
Nmap scan report for ZZ (192.168.56.156)
Host is up (0.00045s latency).
但是,在另一台安装了 Debian 9 x64 Minimal 的笔记本电脑上,整个主机名部分丢失。每当我发出arp-a,我得到以下信息:
? (192.168.56.243) at 40:a3:cc:99:2d:66 [ether] on wlan0
? (192.168.56.146) at 48:bf:6b:e3:bf:5a [ether] on wlan0
? (192.168.56.1) at 10:7b:44:40:61:70 [ether] on wlan0
此外,扫描nmap -sn 192.168.56.0/24产生这个输出:
Starting Nmap 7.60 ( https://nmap.org ) at 2018-08-07 09:17 EDT
Nmap scan report for 192.168.56.1
Host is up (0.0054s latency).
Nmap scan report for 192.168.56.156
Host is up (0.00045s latency).
老实说,我不知道发生了什么,很可能我错过了一些东西Debian 最小化安装,在Ubuntu中安装。但我不知道在哪里可以找到丢失的部分,以便 Debian 机器可以开始向我显示主机名。
有任何想法吗?
编辑: 我的 /etc/nsswitch.conf 正是这样:
root@zxcv:/home/test# cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: compat
group: compat
shadow: compat
gshadow: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
不过,我已经设置了一个带有桥接网络适配器的虚拟机,安装了相同版本的 Debian Minimal,并且我能够获取所有 IP 的主机名。现在的问题是,失败的 Debian 缺少哪些数据包/模块/服务,从而阻止获取主机名?
答案1
您无权访问可将 IP 地址转换为名称的 DNS 服务器。
还有其他方法可以关联主机名和 IP 地址,但如果您有不止一台计算机,DNS 是您的最佳答案。
回复你的评论,是的,/etc/resolv.conf 应该包含 DNS 服务器的地址。在小型网络中,这通常与路由器相同。
答案2
arp
正在询问您的系统以确定它如何将 IP 转换为主机名。如果您使用该-n
开关,它将放弃这一点并仅显示 IP,而不对主机名进行任何转换。
与 Linux 中的大多数工具一样,arp
它使用 NS(名称服务交换机)进行查找。如果您strace
执行arp
命令,您可以看到它查找这些内容:
$ strace -s 2000 arp -a
...
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 5
查看此文件后,arp
您将发现它是如何查找主机名的。
$ grep hosts: /etc/nsswitch.conf
#hosts: db files nisplus nis dns
hosts: files dns myhostname
这表示首先查看文件,然后第二次查询 DNS...files
这里的意思是使用系统的/etc/hosts
文件。您可以使用该命令了解 NS 如何执行此操作getent hosts
。
例子
以我的 CentOS 7 虚拟机为例:
$ arp -a
? (10.0.2.3) at 52:54:00:12:35:03 [ether] on eth0
gateway (10.0.2.2) at 52:54:00:12:35:02 [ether] on eth0
$ arp -an
? (10.0.2.3) at 52:54:00:12:35:03 [ether] on eth0
? (10.0.2.2) at 52:54:00:12:35:02 [ether] on eth0
如果我们查询getent
寻找 10.0.2.2 IP:
$ getent hosts 10.0.2.2
10.0.2.2 gateway
如果 IP 不存在于本地任何文件中,接下来将在 DNS 中查找。由于我的 IP 都是该虚拟机的私有 IP,并且它们没有明确地出现在我的虚拟机定义的 DNS 中,这里顺便定义了 DNS:
$ more /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.2.3
笔记: arp
除了向您显示一个问号之外别无选择,因为它找不到任何可用的名称。