ユーザーやグループ、サービスなどのエントリをすべて一覧したいときは、getentに引数のキーを指定せず、データベース名だけを渡す。

$ getent passwd | cut -d: -f1 | head -3
root
daemon
bin
$ getent passwd | wc -l
20

getent passwdは、すべてのユーザーを/etc/passwdと同じ形式で表示する。実行例はUbuntu 24.04(glibc 2.39)のもの。

全件を列挙できるデータベース

全件の列挙は、データベースによって対応状況が異なる。

データベース列挙内容
passwdできるユーザー
groupできるグループ
shadowできる(root権限が必要)パスワードハッシュと有効期限
gshadowできる(root権限が必要)グループのパスワード
hosts、ahosts、ahostsv4、ahostsv6できる/etc/hostsのエントリ
networksできるネットワーク名
protocolsできるプロトコル
servicesできるサービス
rpcできるRPCプログラム
aliasesできるメールのエイリアス
ethersできないMACアドレス
netgroupできないネットグループ
initgroupsできないユーザーの所属グループ

shadowとgshadowを一般ユーザーが列挙すると、何も表示されない。エントリを指定したときと違い、終了コードは0になる。

$ getent shadow | wc -l
0
$ getent shadow >/dev/null; echo $?
0

列挙できないデータベースは、メッセージを表示して終了コード3になる。

$ getent ethers
Enumeration not supported on ethers
$ echo $?
3

終了コードの一覧は次の記事を参照。

参考: 【getent】ユーザーやグループが存在するかシェルスクリプトで判定する (終了コード)

列挙した結果を加工する

出力は各データベースのファイルと同じ形式なので、cutやawk、sortで加工できる。

ユーザー名やグループ名だけを一覧する。

$ getent group | cut -d: -f1 | head -5
root
daemon
bin
sys
adm

UIDの順に並べる。

$ getent passwd | sort -t: -k3 -n | tail -3 | cut -d: -f1,3
ubuntu:1000
alice:1001
nobody:65534

システムユーザーを除いた一般ユーザーだけを抽出する。

$ getent passwd | awk -F: '$3>=1000 && $3<65534 {print $1}'
ubuntu
alice

エントリの件数を数える。

$ getent services | wc -l
318

hostsの列挙は/etc/hostsのIPv4のエントリだけ

getent hostsを引数なしで実行すると、/etc/hostsのエントリが表示される。DNSのレコードは列挙されない。

$ getent hosts
127.0.0.1       localhost
127.0.0.1       localhost ip6-localhost ip6-loopback
172.17.0.2      e3cf0a962a6f

IPv6のアドレスだけを持つエントリは表示されない。/etc/hostsにfd00::1 v6only.testと10.5.5.5 v4only.testを書くと、IPv4のv4only.testだけが表示される。

$ getent hosts
127.0.0.1       localhost
127.0.0.1       localhost ip6-localhost ip6-loopback
172.17.0.2      e3cf0a962a6f
10.5.5.5        v4only.test

ahosts・ahostsv4・ahostsv6も同じ結果になる。ahostsv6でもIPv4のエントリが表示される。-Aを付けても変わらない。

/etc/hostsの内容をそのまま確認したいときは、cat /etc/hostsを使う。

参照元を絞って列挙する

列挙は、/etc/nsswitch.confに書かれたすべての参照元を対象にする。ローカルのファイルだけを列挙したいときは、-s filesを付ける。

$ getent -s files passwd | wc -l
20

参考: 【getent】参照元を指定して取得する (-s)

ディレクトリサービスは全件が出るとは限らない

LDAPやSSSDなどのディレクトリサービスを使う環境では、getent passwdを実行しても、ディレクトリサービス上のユーザーが全件表示されるとは限らない。たとえばSSSDは、sssd.confのenumerateオプションを有効にしていないと、全件の列挙に応答しない。

全件の列挙は、ユーザー数が多いと時間もかかる。ディレクトリサービス上の特定のユーザーは、名前やUIDを指定すれば引ける。

参考: 【getent】ユーザーの情報(UID・ホームディレクトリ・シェル)を調べる (passwd)