グループに所属するユーザーを調べたいときはgetent group、ユーザーが所属するグループを調べたいときはgetent initgroupsを使う。
$ getent group devs
devs:x:2000:alice,bob
$ getent initgroups alice
alice 2000 2001
devsグループ(GID 2000)にaliceとbobが所属し、aliceはdevsとops(GID 2001)に所属している環境での実行例である。実行例はUbuntu 24.04(glibc 2.39)のもの。
getent groupは、/etc/groupを直接読むgrepと違い、/etc/nsswitch.confに従ってグループを探す。LDAPやSSSDなどのディレクトリサービス上のグループも表示できる。
グループのメンバーを調べる
getent group グループ名は、/etc/groupと同じ形式の1行を表示する。コロン区切りの4項目である。
| 項目 | 例 | 内容 |
|---|---|---|
| 1 | devs | グループ名 |
| 2 | x | パスワード(通常はx) |
| 3 | 2000 | GID |
| 4 | alice,bob | メンバー(カンマ区切り) |
グループ名の代わりにGIDも渡せる。複数の引数も並べられる。
$ getent group 2001
ops:x:2001:alice
$ getent group devs ops
devs:x:2000:alice,bob
ops:x:2001:alice
存在しないグループは何も表示されず、終了コードが2になる。
$ getent group nogroup_x
$ echo $?
2
メンバーを1行に1人ずつ表示したいときは、cutとtrを使う。
$ getent group devs | cut -d: -f4 | tr ',' '\n'
alice
bob
プライマリグループのメンバーは4項目目に出ない
ユーザーのプライマリグループは/etc/passwdのGIDで決まる。プライマリグループとして所属しているだけのユーザーは、getent groupのメンバー欄に表示されない。
useradd aliceで作られたaliceのプライマリグループはalice(GID 1001)だが、メンバー欄は空である。
$ getent group alice
alice:x:1001:
プライマリグループに所属するユーザーを調べるには、getent passwdのGIDで絞り込む。
$ getent passwd | awk -F: '$4==1001{print $1}'
alice
参考: 【getent】ユーザーの情報(UID・ホームディレクトリ・シェル)を調べる (passwd)
ユーザーが所属するグループを調べる
getent initgroups ユーザー名は、ユーザーが所属するグループのGIDを1行で表示する。
$ getent initgroups alice
alice 2000 2001
$ getent initgroups bob
bob 2000
1列目がユーザー名、2列目以降がGIDである。GIDからグループ名に変換するには、getent groupに渡す。
$ for g in $(getent initgroups alice | cut -d' ' -f2-); do getent group $g | cut -d: -f1; done
devs
ops
プライマリグループは含まれない
getent initgroupsの結果には、ユーザーのプライマリグループが含まれない。aliceのプライマリグループ(GID 1001)は、上の出力に無い。
idとgroupsは、プライマリグループも含めて表示する。
$ id alice
uid=1001(alice) gid=1001(alice) groups=1001(alice),2000(devs),2001(ops)
$ groups alice
alice : alice devs ops
プライマリグループも含めたグループの一覧が欲しいときは、idやgroupsを使う。getent initgroupsは、追加で所属しているグループだけを調べたいときに使う。
存在しないユーザーでも終了コードは0になる
追加のグループを持たないユーザーや、存在しないユーザーを指定すると、ユーザー名だけが表示される。存在しないユーザーでも終了コードは0である。
$ getent initgroups nosuchuser
nosuchuser
$ echo $?
0
ユーザーの存在確認にgetent initgroupsは使えない。getent passwdを使う。
参考: 【getent】ユーザーやグループが存在するかシェルスクリプトで判定する (終了コード)
すべてのグループを一覧する
引数を省略すると、すべてのグループが表示される。initgroupsは全件の一覧に対応していない。
参考: 【getent】データベースのエントリを全件列挙する (キー省略)
