ユーザーのUID、ホームディレクトリ、ログインシェルなどを調べたいときは、getent passwdを使う。

$ getent passwd alice
alice:x:1001:1001:Alice Example:/home/alice:/bin/bash

/etc/passwdと同じ形式の1行が表示される。/etc/passwdを直接読むgrepと違い、getent passwdは/etc/nsswitch.confに従ってユーザーを探す。/etc/passwdに無い、LDAPやSSSDなどのディレクトリサービス上のユーザーも表示できる。実行例はUbuntu 24.04(glibc 2.39)のもの。

出力の読み方

出力はコロン区切りの7項目である。

項目例内容
1aliceユーザー名
2xパスワード(xはハッシュを/etc/shadowで管理している意味)
31001UID
41001プライマリグループのGID
5Alice Exampleコメント欄(フルネームなど。空のこともある)
6/home/aliceホームディレクトリ
7/bin/bashログインシェル

参考: 【getent】パスワードハッシュや有効期限を確認する (shadow/gshadow)

特定の項目だけを取り出す

cutでコロン区切りの項目を指定すると、ホームディレクトリやシェルだけを取り出せる。

$ getent passwd alice | cut -d: -f6
/home/alice
$ getent passwd bob | cut -d: -f7
/bin/zsh
$ getent passwd alice | cut -d: -f3,4
1001:1001

シェルスクリプトで、ユーザーのホームディレクトリを調べたいときに使える。eval echo ~$userのようにevalを使わずに済む。

home=$(getent passwd "$user" | cut -d: -f6)

UIDで検索する

引数にUIDを渡すと、UIDからユーザーを探せる。

$ getent passwd 1500
bob:x:1500:1500::/home/bob:/bin/zsh
$ getent passwd 0
root:x:0:0:root:/root:/bin/bash

複数のユーザーを調べる

引数にはユーザー名やUIDを複数並べられる。

$ getent passwd root alice
root:x:0:0:root:/root:/bin/bash
alice:x:1001:1001:Alice Example:/home/alice:/bin/bash

存在しないユーザーは何も表示されず、終了コードが2になる。複数の引数のうち1つでも見つからないと、他のユーザーが表示されても終了コードは2である。

$ getent passwd nosuchuser
$ echo $?
2
$ getent passwd alice nosuchuser
alice:x:1001:1001:Alice Example:/home/alice:/bin/bash
$ echo $?
2

シェルスクリプトでユーザーの存在確認をする方法は、次の記事で扱っている。

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

すべてのユーザーを一覧する

引数を省略すると、すべてのユーザーが表示される。

$ getent passwd | cut -d: -f1 | head -5
root
daemon
bin
sys
sync

システムユーザーを除いた一般ユーザーだけを探したいときは、UIDで絞り込む。一般ユーザーのUIDは、多くのLinuxで1000以上である。

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

65534はnobodyのUIDである。範囲は/etc/login.defsのUID_MINなどで決まるので、ディストリビューションによって異なる場合がある。

SSSDやLDAPを使う環境では、引数を省略しても全ユーザーが表示されるとは限らない。

参考: 【getent】データベースのエントリを全件列挙する (キー省略)

grep /etc/passwdとの違い

/etc/passwdに書かれたユーザーだけを調べる場合は、grepと結果は変わらない。

$ grep '^alice:' /etc/passwd
alice:x:1001:1001:Alice Example:/home/alice:/bin/bash

getent passwdは、/etc/nsswitch.confのpasswdの行に書かれた参照元をすべて引く。passwd: files sssと書かれた環境では、/etc/passwdとSSSDの両方を検索する。ログインできるのに/etc/passwdに無いユーザーは、getent passwdなら見つかる。

特定の参照元だけで調べたいときは、-sオプションを使う。

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