为什么 host 命令不能解析 /etc/hosts 中的条目?

为什么 host 命令不能解析 /etc/hosts 中的条目?

/etc/hosts我在 ubuntu 12.04 机器上有以下文件

127.0.0.1 localhost
10.248.27.66 ec2-50-112-220-110.us-west-2.compute.amazonaws.com puppetmaster

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

但是 host 命令无法正确解析名称puppetmaster,而 telnet 命令可以

root@ip-10-248-34-162:/home/ubuntu# host puppetmaster
Host puppetmaster not found: 3(NXDOMAIN)

root@ip-10-248-34-162:/home/ubuntu# telnet puppetmaster 8140
Trying 10.248.27.66...
Connected to ec2-50-112-220-110.us-west-2.compute.amazonaws.com.
Escape character is '^]'.

为什么 host 命令不能解析 /etc/hosts 中的条目?

答案1

host程序使用libresolv直接执行DNS查询,即不使用gethostbyname

大多数程序在尝试连接到另一台主机时,都会调用gethostbyname系统调用或类似函数。此函数遵循的配置/etc/nsswitch.conf。此文件有一行在 Ubuntu 12.04 中默认为以下内容:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

这意味着它将首先使用/etc/hosts,然后再回退到 DNS 查询。

如果您想通过这种方式执行主机查找,可以使用getent hosts。例如:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

我希望这有帮助。

答案2

因为该host实用程序仅仅是一个 DNS 查找实用程序。

大多数应用程序使用库调用getaddrinfogethostbyname。这些库查询一个文件,/etc/nsswitch.conf以确定查找优先级和如何执行不同查找的策略。

通常/etc/nsswitch.conf包含以下行

hosts:        files dns

它告诉程序首先进行询问/etc/hosts,如果不成功则询问 DNS。

由于主机只执行 DNS 查找,因此它不会深入/etc/hosts进行查找。

答案3

您会发现dig和 的nslookup行为方式与 相同host

原因是所有这些命令的目的都是执行 DNS 查找,而不是查找文件。

大多数其他程序使用操作系统的名称解析器,它会进行咨询/etc/nsswitch.conf,然后(如果需要)/etc/resolv.conf决定如何解析您请求的主机名。(这是一种简化,还有其他选项。)该nsswitch.conf文件通常优先考虑本地文件而不是 DNS。

答案4

检查文件 /etc/nsswitch.conf 并查找以单词“hosts”开头的行?你在这一行看到单词“files”了吗?如果是,它是在单词“dns”之前还是之后?

在正常系统上,此行应类似于

hosts      files dns

如果你的不存在或者顺序不同,那可能是你的问题。

相关内容