/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 查找实用程序。
大多数应用程序使用库调用getaddrinfo
或gethostbyname
。这些库查询一个文件,/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
如果你的不存在或者顺序不同,那可能是你的问题。