/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などのファイル
dnsDNSサーバー
dbデータベースファイル
sssSSSD
ldapLDAPサーバー
nisNIS

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

名前解決が期待と違うときは、以下の順に切り分ける。

  1. getent hostsで、アプリケーションが見る結果を確認する
  2. getent -s files hostsで、/etc/hostsにエントリがあるか確認する
  3. 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

ライブラリのパスはアーキテクチャによって異なる。