ユーザーのパスワードハッシュや、パスワードの有効期限の設定を確認したいときは、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項目である。
| 項目 | 例 | 内容 |
|---|---|---|
| 1 | alice | ユーザー名 |
| 2 | [ハッシュ] | パスワードハッシュ |
| 3 | 20726 | パスワードを最後に変更した日(1970年1月1日からの日数) |
| 4 | 1 | パスワードを変更できるまでの最短日数 |
| 5 | 90 | パスワードの有効日数 |
| 6 | 14 | 期限切れ前に警告を出す日数 |
| 7 | 7 | 期限切れ後もログインできる猶予日数 |
| 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
| 項目 | 例 | 内容 |
|---|---|---|
| 1 | devs | グループ名 |
| 2 | ! | グループのパスワード(!は未設定) |
| 3 | (空) | グループの管理者 |
| 4 | alice | メンバー |
getent gshadowも、一般ユーザーでは終了コード2になる。
見つからないのか権限が無いのかは区別できない
一般ユーザーでgetent shadowを実行したときの終了コード2は、エントリが無いときの終了コード2と同じである。ユーザーが存在するかを判定するときは、root権限が不要なgetent passwdを使う。
参考: 【getent】ユーザーやグループが存在するかシェルスクリプトで判定する (終了コード)
ハッシュの作り方は次の記事を参照。
参考: 【openssl】/etc/shadow用のパスワードハッシュを作る (passwd)
