/etc/hostsとDNSのどちらの結果なのかを切り分けたいときなど、特定の参照元だけでgetentを実行したいときは、-sオプションを使う。
$ getent -s files hosts example.com
10.9.9.9 example.com
$ getent -s dns hosts example.com
172.66.147.243 example.com
104.20.23.154 example.com
/etc/hostsに10.9.9.9 example.comを書いた環境での実行例である。-s filesは/etc/hostsだけ、-s dnsはDNSだけを引く。実行例はUbuntu 24.04(glibc 2.39)のもの。
参照元はnsswitch.confで決まる
-sを付けないgetentは、/etc/nsswitch.confに書かれた参照元を左から順に引く。
$ grep -v '^#' /etc/nsswitch.conf | grep .
passwd: files
group: files
shadow: files
gshadow: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
行頭がデータベース名、続く単語が参照元である。hosts: files dnsは、/etc/hostsを先に引き、見つからなければDNSを引く。主な参照元は以下のとおり。
| 参照元 | 内容 |
|---|---|
files | /etc/hostsや/etc/passwdなどのファイル |
dns | DNSサーバー |
db | データベースファイル |
sss | SSSD |
ldap | LDAPサーバー |
nis | NIS |
sssやldapは、対応するパッケージを入れてnsswitch.confに書いた環境でだけ使える。
参照元を1つに絞って調べる
-sには、nsswitch.confに書く参照元の名前を渡す。--service=dnsのように長い形式でも指定できる。
$ getent -s files hosts myserver.test
10.0.0.5 myserver.test
$ getent -s dns hosts myserver.test
$ echo $?
2
/etc/hostsにだけ書いたmyserver.testは、-s filesなら見つかり、-s dnsでは見つからず終了コードが2になる。
/etc/hostsとDNSで、同じ名前の結果が異なる場合も確認できる。getent hostsはfilesが先なので、/etc/hostsの値を返す。DNSの値を確認したいときに-s dnsを使う。
$ getent hosts example.com
10.9.9.9 example.com
$ getent -s dns hosts example.com
172.66.147.243 example.com
104.20.23.154 example.com
名前解決が期待と違うときは、以下の順に切り分ける。
getent hostsで、アプリケーションが見る結果を確認するgetent -s files hostsで、/etc/hostsにエントリがあるか確認するgetent -s dns hostsで、DNSの結果を確認する
hosts以外のデータベースでも同じように使える。
$ getent -s files passwd root
root:x:0:0:root:/root:/bin/bash
sssやldapを設定した環境では、-s filesと-s sssを比べると、ユーザーがローカルの/etc/passwdにいるのか、ディレクトリサービスにいるのかを切り分けられる。
参照元を複数指定して順序を入れ替える
ダブルクォートで囲んで空白区切りにすると、複数の参照元を指定できる。/etc/nsswitch.confを書き換えずに、dns filesの順で引いた結果を試せる。
$ getent -s "dns files" hosts example.com
172.66.147.243 example.com
104.20.23.154 example.com
$ getent -s "dns files" hosts myserver.test
10.0.0.5 myserver.test
DNSにあるexample.comはDNSの結果が返る。DNSに無いmyserver.testは、次の参照元のfilesから返る。
データベース名を付けて指定する
データベース名:参照元の形式でも指定できる。
$ getent -s hosts:dns hosts example.com
172.66.147.243 example.com
104.20.23.154 example.com
存在しない参照元を指定してもエラーにならない
-sに存在しない参照元や、インストールされていない参照元を指定しても、エラーメッセージは出ない。何も表示せず、終了コードが2になる。
$ getent -s nosuch hosts example.com
$ echo $?
2
$ getent -s sss passwd root
$ echo $?
2
エントリが無い場合と同じ結果になるため、-sのスペルミスや、参照元のモジュールが無いことに気づきにくい。何も返らないときは、参照元の名前が正しいか、nsswitch.confに書ける参照元が環境に入っているかを確認する。libnss_から始まるライブラリが、参照元に対応するモジュールである。
$ ls /lib/*/libnss_*
/lib/aarch64-linux-gnu/libnss_compat.so.2
/lib/aarch64-linux-gnu/libnss_dns.so.2
/lib/aarch64-linux-gnu/libnss_files.so.2
/lib/aarch64-linux-gnu/libnss_hesiod.so.2
ライブラリのパスはアーキテクチャによって異なる。
