web-dev-qa-db-ja.com

Hostコマンドが/ etc / hostsのエントリを解決しないのはなぜですか?

私は以下を持っています/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のエントリを解決しないのはなぜですか?

26
user784637

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

これがお役に立てば幸いです。

53
Kvisle

HostユーティリティはDNSルックアップユーティリティ専用であるためです。

ほとんどのアプリケーションは、ライブラリ呼び出しgetaddrinfoまたはgethostbynameを使用します。これらのライブラリは、/etc/nsswitch.confというファイルに問い合わせて、さまざまなルックアップを実行する方法のルックアップの優先順位とポリシーを決定します。

通常、/etc/nsswitch.confには次の行が含まれます

hosts:        files dns

これは、最初に/etc/hostsに問い合わせを行い、失敗した場合はDNSに問い合わせるようにプログラムに指示します。

ホストはDNSルックアップのみを行うため、/etc/hostsを覗いてルックアップを行うことはありません。

10
Matthew Ife

DignslookupHostと同じように動作することがわかります。

これは、これらすべてのコマンドの目的がDNSルックアップを行うことであり、ファイルを調べることではないためです。

他のほとんどのプログラムは、オペレーティングシステムの名前リゾルバを使用して、/etc/nsswitch.conf次に(必要な場合)/etc/resolv.confは、要求しているホスト名を解決する方法を決定します。 (これは単純化であり、他のオプションがあります。)nsswitch.confファイルは通常、DNSではなくローカルファイルを優先します。

4
Ladadadada