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


25

/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中的条目?

Answers:


52

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
感谢Kvisle,但我还是有些困惑。输入的行/etc/nsswitch.conf看起来像这样hosts: files dns,我将其更改为,hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4但是在两种情况下/etc/hosts都不会查询,而是直接进行了dns查询。/etc/hosts当使用诸如dig或命令时,如何确保首先查询host
user784637 2013年

4
你不能 挖掘/主机直接使用DNS。如果需要先检查主机文件的名称查找,则必须使用getent hosts或使用其他使用gethostbyname()
Kvisle 2013年

哦,我明白了,我的糟糕,我现在知道了=)
user784637 2013年

1
我认为,如今应该使用getent ahosts而不是getent hosts因为getent hosts使用gethostbyaddr()gethostbyname*()已过时。如果我正确理解,getent hosts可以模拟用来工作的UNIX C旧程序,并getent ahosts模拟现代程序的工作方式。
Mikko Rantalainen

但是有没有办法使host命令也使用/ etc / hosts?
Kornel

10

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

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

通常/etc/nsswitch.conf包含行

hosts:        files dns

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

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


3

你会发现dignslookup表现方法一样host

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

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



-1

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

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

hosts      files dns

如果您的不在或顺序不同,则可能是您的问题。


它存在并且看起来像这样hosts: files dns
user784637
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.