ユーザーやグループ、サービスなどのエントリをすべて一覧したいときは、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
ディレクトリサービスは全件が出るとは限らない
LDAPやSSSDなどのディレクトリサービスを使う環境では、getent passwdを実行しても、ディレクトリサービス上のユーザーが全件表示されるとは限らない。たとえばSSSDは、sssd.confのenumerateオプションを有効にしていないと、全件の列挙に応答しない。
全件の列挙は、ユーザー数が多いと時間もかかる。ディレクトリサービス上の特定のユーザーは、名前やUIDを指定すれば引ける。
参考: 【getent】ユーザーの情報(UID・ホームディレクトリ・シェル)を調べる (passwd)
