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

我有一个Ubuntu 12.04机器上的以下/etc/hosts文件

 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命令不能正确parsing名称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命令不能parsing/ etc / hosts中的条目?

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

大多数程序在尝试连接到另一个主机时会调用gethostbyname系统调用或类似的函数。 这个函数服从/etc/nsswitch.conf的configuration。 这个文件有一行,在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 

我希望这有帮助。

因为host实用程序专门是DNS查找实用程序。

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

通常/etc/nsswitch.conf包含该行

 hosts: files dns 

它告诉程序首先询问/etc/hosts ,然后询问DNS是否失败。

由于主机专门进行DNS查找,因此它不会窥探/etc/hosts来执行查找。

你会发现dignslookup行为与host相同。

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

大多数其他程序使用操作系统的名称parsing程序来查询/etc/nsswitch.conf ,然后(如果需要) /etc/resolv.conf来决定如何parsing您请求的主机名。 (这是一个简化,还有其他选项。) nsswitch.conf文件通常优先于本地文件而不是DNS。

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

在一个正常的系统上,这条线应该是这样的

 hosts files dns 

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