名前解決が必要なときに/ etc / hostsを開いて読み取るプログラムまたはスクリプトの名前は何ですか? Linux/Unixディストリビューションによって異なりますか?
ホストのマニュアルページを読み、whereisでホストというバイナリを見つけようとしましたが、whereisは/etc/hosts.allowや/etc/hosts.denyなどのファイル名を出力します。私はHosts.allowとHost.denyがTCPWrappers用の設定ファイルであるという印象を受け、それを始めたときよりもはるかに混乱しています。
答え1
具体的ではないプログラムこのファイルを解析します。
多くの標準ファイル(例/etc/hosts
:)は、標準ライブラリファイル(例:)によって解析されますgethostbyname(3)
。しかし、物語ははるかに複雑かもしれません。
ホスト名解決は通常/etc/nsswitch.conf
。
例えば
% grep hosts /etc/nsswitch.conf
hosts: files dns
このエントリはパーサールーチンに「ファイル」バックエンドを使用し、そこで結果が見つからない場合はDNSルックアップを実行するように指示します。ここに別の値(たとえば、ldap
またはnis
)を入力すると、ホスト名の検索方法が変わる可能性があります。
これらのルーチンはしばしば「名前指定サービス」と呼ばれます。ユーザー名照会(passwd
)、グループ項目(group
)などにも同じ概念が使用されます。
したがって、これを行うと、ping a.remote.host
プログラムping
はglibcライブラリ関数を呼び出してロードされますnsswitch.conf
。その結果、ping
ライブラリと NS ルーチンが独自に作業を実行するのを見ることはできません。
名前検索を実行するために使用できる名前検索と呼ばれるプログラムがありますgetent
。 「データベース」(データベース内の項目の1つnsswitch.conf
)と検索する値を指定します。
だから
getent hosts a.remote.host
名前の検索は、で定義されている規則に従って行われますnsswitch.conf
。これはテスト目的に便利で、時にはスクリプトに役立ちます。
---付録----
この情報は以下のStephenのコメントからのものですが、非常に役に立つので、彼の答えに追加します。
strace getent hosts www.google.com 2>&1 | grep libnss_
名前の解決に使用するライブラリ(またはなし)を教えてください。と書いてあると使われるlibnss_files
の/etc/hosts
です。これが表示されると、libnss_dns
DNSが使用されます。libnss_myhostname
何も機能しておらず、バックアップGNUシステムが機能していないことを意味します(そしておそらくすでに失敗している可能性があります)。リストされているライブラリがない場合は、おそらく数値アドレス(たとえば)を使用しているので、127.0.0.1
パーサーは必要ありません。
答え2
GNU / Linuxシステムでは/etc/hosts
通常、ライブラリから読み取られますglibc
。
バラよりGNUドキュメントこのトピックについて:
内部的には、システムはデータベースを使用してホスト名とホスト番号間のマッピングを追跡します。このデータベースは通常、/etc/hostsファイルまたはネームサーバーによって提供される同等のファイルです。データベースへのアクセスに使用される関数やその他のシンボルは、netdb.hで宣言されています。これはBSD機能であり、netdb.hが含まれている場合は無条件に定義されます。
すべてのPOSIX準拠のUNIXおよびUNIX様システムは、netdb.hが次のようになるため、このガイドラインに従います。POSIX規格。主な違いは、すべてのUNIXシステムですglibc
。
GNUドキュメントでは、から収集されたデータを読み取るなどのgethostbyname
機能についても説明します。どちらの機能も今日、事実上廃止されました。gethostbyaddr
/etc/hosts
getaddrinfo
そしてgetnameinfo
使用すべき