/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 '^]'.
为什么主机命令不解析 /etc/hosts 中的条目?
该
host
程序用于libresolv
直接执行 DNS 查询,即不使用gethostbyname
.大多数程序在尝试连接到另一台主机时会调用
gethostbyname
系统调用或类似函数。该函数服从 的配置/etc/nsswitch.conf
。该文件有一行在 Ubuntu 12.04 中默认为以下内容:这意味着它将首先使用
/etc/hosts
,然后回退到 DNS 查询。如果您想以这种方式执行主机查找,您可以使用
getent hosts
. 例如:我希望这有帮助。
因为该
host
实用程序是专门的 DNS 查找实用程序。大多数应用程序使用库调用
getaddrinfo
或gethostbyname
. 这些库询问一个名为的文件/etc/nsswitch.conf
以确定查找优先级和如何执行不同查找的策略。通常
/etc/nsswitch.conf
包含行它告诉程序先查询
/etc/hosts
,如果不成功再查询 DNS。由于主机只执行 DNS 查找,因此它不会窥视
/etc/hosts
以进行查找。您会发现它
dig
的nslookup
行为方式与host
.这是因为所有这些命令的目的都是进行 DNS 查找,而不是查找文件。
大多数其他程序使用操作系统的名称解析器进行咨询
/etc/nsswitch.conf
,然后(如果需要)/etc/resolv.conf
决定如何解析您请求的主机名。(这是一个简化,还有其他选项。)nsswitch.conf
文件通常优先于本地文件而不是 DNS。检查文件 /etc/nsswitch.conf 并查找以单词“hosts”开头的行?你在这一行看到“文件”这个词了吗?如果是,它是在“dns”这个词之前还是之后?
在一个正常的系统上,这一行应该是这样的
如果您的不存在或顺序不同,那可能是您的问题。