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

use*_*637 30 domain-name-system linux ubuntu

/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
Run Code Online (Sandbox Code Playgroud)

然而,主机命令不能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 '^]'.
Run Code Online (Sandbox Code Playgroud)

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

Kvi*_*sle 59

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

大多数程序在尝试连接到另一台主机时,会调用gethostbyname系统调用或类似的函数。此函数服从 的配置/etc/nsswitch.conf。这个文件有一行在 Ubuntu 12.04 中默认如下:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
Run Code Online (Sandbox Code Playgroud)

这意味着它将首先使用/etc/hosts,然后回退到 DNS 查询。

如果要以这种方式执行主机查找,可以使用getent hosts. 例如:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。

  • 你不能。dig/host 直接使用 DNS。如果您需要先进行名称查找以检查主机文件,则必须使用 `getent hosts` 或其他使用 `gethostbyname()` 的东西 (5认同)
  • 谢谢 Kvisle,但我还是有点困惑。`/etc/nsswitch.conf` 中的行看起来像这样 `hosts: files dns`,我将其更改为 `hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4` 但是在这两种情况下 `/etc/hosts` 都不是查询,而不是直接进行 dns 查询。在使用像`dig`或`host`这样的命令时,如何确保首先查询`/etc/hosts`? (2认同)
  • 我相信现在应该使用 `getent ahosts` 而不是 `getent hosts`,因为 `getent hosts` 使用的是过时的 `gethostbyaddr()` 或 `gethostbyname*()`。如果我理解正确的话,`getent hosts` 模拟过去使用的 UNIX C 程序有多老,而 `getent ahosts` 模拟现代程序应该工作的方式。 (2认同)

Mat*_*Ife 12

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

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

通常/etc/nsswitch.conf包含行

hosts:        files dns
Run Code Online (Sandbox Code Playgroud)

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

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