我有一个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查找实用程序。
大多数应用程序使用库调用getaddrinfo
或gethostbyname
。 这些库询问一个名为/etc/nsswitch.conf
的文件,以确定如何执行不同查找的查找优先级和策略。
通常/etc/nsswitch.conf
包含该行
hosts: files dns
它告诉程序首先询问/etc/hosts
,然后询问DNS是否失败。
由于主机专门进行DNS查找,因此它不会窥探/etc/hosts
来执行查找。
你会发现dig
和nslookup
行为与host
相同。
原因是所有这些命令的目的是做DNS查找,而不是查看文件。
大多数其他程序使用操作系统的名称parsing程序来查询/etc/nsswitch.conf
,然后(如果需要) /etc/resolv.conf
来决定如何parsing您请求的主机名。 (这是一个简化,还有其他选项。) nsswitch.conf
文件通常优先于本地文件而不是DNS。
检查文件/etc/nsswitch.conf并查找以“hosts”开头的行? 你在这一行看到“文件”这个词吗? 如果是的话,在“dns”之前还是之后?
在一个正常的系统上,这条线应该是这样的
hosts files dns
如果你的不在场或按不同的顺序,那可能是你的问题。