ユーザーのパスワードハッシュや、パスワードの有効期限の設定を確認したいときは、getent shadowを使う。/etc/shadowと同じ形式の1行が表示される。

$ sudo getent shadow alice
alice:[ハッシュ]:20726:1:90:14:7::

/etc/shadowはroot権限が必要なファイルで、getent shadowも同じである。一般ユーザーが実行すると、何も表示されず終了コードが2になる。実行例はUbuntu 24.04(glibc 2.39)のもの。aliceは検証用に作成したユーザーで、ハッシュは省略している。

$ getent shadow alice
$ echo $?
2

出力の読み方

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

項目例内容
1aliceユーザー名
2[ハッシュ]パスワードハッシュ
320726パスワードを最後に変更した日(1970年1月1日からの日数)
41パスワードを変更できるまでの最短日数
590パスワードの有効日数
614期限切れ前に警告を出す日数
77期限切れ後もログインできる猶予日数
8(空)アカウントの有効期限(1970年1月1日からの日数)
9(空)予約

3〜8項目は日数である。日付に変換するには、dateを使う。

$ d=$(sudo getent shadow alice | cut -d: -f3)
$ date -u -d "1970-01-01 +${d} days" +%F
2026-09-30

ハッシュ欄の読み方

2項目目は、パスワードハッシュか、ログインできない状態を示す記号である。

値意味
$y$...yescryptのハッシュ(Ubuntu 24.04の既定)
$6$...SHA-512のハッシュ
$5$...SHA-256のハッシュ
!パスワードが未設定で、パスワードでログインできない
*パスワードでログインできない(システムユーザーなど)
!で始まるハッシュアカウントがロックされている

先頭の$y$や$6$から、ハッシュの方式を判別できる。

$ sudo getent shadow alice | cut -d: -f2 | cut -d'$' -f2
y

useraddで作っただけのユーザーは!、rootやdaemonなどは*である。

$ sudo getent shadow bob
bob:!:20726:0:99999:7:::
$ sudo getent shadow daemon
daemon:*:20701:0:99999:7:::

passwd -lでロックすると、ハッシュの先頭に!が付く。passwd -uで解除すると、!が外れる。

$ sudo passwd -l alice
$ sudo getent shadow alice | cut -d: -f2 | cut -c1-5
!$y$j
$ sudo passwd -u alice
$ sudo getent shadow alice | cut -d: -f2 | cut -c1-4
$y$j

ロックされたユーザーや、パスワードが未設定のユーザーを探すには、2項目目が!で始まるユーザーを抽出する。

$ sudo getent shadow | awk -F: '$2 ~ /^!/ {print $1}'
ubuntu
bob

chage -lとの使い分け

chage -lは、有効期限の設定を日付で読みやすく表示する。

$ sudo chage -l alice
Last password change					: Sep 30, 2026
Password expires					: Dec 29, 2026
Password inactive					: Jan 05, 2027
Account expires						: never
Minimum number of days between password change		: 1
Maximum number of days between password change		: 90
Number of days of warning before password expires	: 14

人が内容を確認するときはchage -lが便利である。スクリプトで値を取り出すときは、getent shadowをcutやawkで処理するほうが扱いやすい。たとえば、パスワードを最後に変更してからの日数は、こう求める。

$ today=$(( $(date +%s) / 86400 ))
$ sudo getent shadow alice | awk -F: -v t=$today '{print t-$3}'
0

passwd -eでパスワードを期限切れにすると、3項目目が0になる。次回ログイン時にパスワードの変更が求められる。

$ sudo passwd -e bob
$ sudo getent shadow bob | cut -d: -f3
0

グループのパスワードを確認する

getent gshadowは、/etc/gshadowの内容を表示する。コロン区切りの4項目である。

$ sudo getent gshadow devs
devs:!::alice
項目例内容
1devsグループ名
2!グループのパスワード(!は未設定)
3(空)グループの管理者
4aliceメンバー

getent gshadowも、一般ユーザーでは終了コード2になる。

見つからないのか権限が無いのかは区別できない

一般ユーザーでgetent shadowを実行したときの終了コード2は、エントリが無いときの終了コード2と同じである。ユーザーが存在するかを判定するときは、root権限が不要なgetent passwdを使う。

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

ハッシュの作り方は次の記事を参照。

参考: 【openssl】/etc/shadow用のパスワードハッシュを作る (passwd)