passwd は、Linux でユーザーのパスワードを設定・変更するコマンドです。それに加えて、アカウントのロック/解除、パスワードの有効期限設定まで担当します。同じ名前の /etc/passwd というファイルもあり、こちらは「パスワードそのもの」ではなくアカウント一覧を保持しています。この記事では両者の違いから、実際の出力・エラーメッセージまでを Ubuntu 24.04 で実行しながら解説します。
まず結論:やりたいこと別の1行
| やりたいこと | コマンド |
|---|---|
| 自分のパスワードを変更する | passwd |
| 他ユーザーのパスワードを変更する | sudo passwd alice |
| パスワードの状態を確認する | sudo passwd -S alice |
| アカウントをロックする | sudo passwd -l alice |
| ロックを解除する | sudo passwd -u alice |
| 次回ログイン時に変更を強制する | sudo passwd -e alice |
| スクリプトから非対話で設定する | echo 'alice:新パスワード' | sudo chpasswd |
| アカウント一覧を見る(ファイル) | cat /etc/passwd |
本記事のコマンドと出力は、すべて Ubuntu 24.04.4 LTS のコンテナ上で実際に実行して確認したものです。
passwd コマンドと /etc/passwd ファイルは別物
「passwd」で検索すると、コマンドの解説とファイルの解説が混ざって出てきます。この2つは役割がまったく違います。
passwd(コマンド) | /etc/passwd(ファイル) | |
|---|---|---|
| 正体 | /usr/bin/passwd という実行ファイル | アカウント情報のテキストファイル |
| 役割 | パスワードの変更・ロック・期限設定 | ユーザー名・UID・ホーム・シェルの一覧 |
| パスワードの保管 | 書き込み先は /etc/shadow | 保管していない(2列目は x 固定) |
| manページ | man 1 passwd | man 5 passwd |
/etc/passwd の7フィールド
/etc/passwd は1行1アカウントで、コロン区切りの7フィールドです。実際の中身を見てみます。
$ grep -E '^(root|daemon|carol):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
carol:x:1003:1003::/home/carol:/bin/bash
| # | フィールド | carol の値 | 意味 |
|---|---|---|---|
| 1 | ユーザー名 | carol | ログイン名 |
| 2 | パスワード | x | x は「本体は /etc/shadow にある」印 |
| 3 | UID | 1003 | 0 は root。1000 以上が一般ユーザー |
| 4 | GID | 1003 | プライマリグループの ID |
| 5 | コメント(GECOS) | (空) | 氏名などの説明。空でも問題ない |
| 6 | ホームディレクトリ | /home/carol | ログイン直後の作業ディレクトリ |
| 7 | ログインシェル | /bin/bash | /usr/sbin/nologin ならログイン不可 |
daemon の7列目が /usr/sbin/nologin になっているのが、いわゆるシステムユーザーの目印です。パーミッションを見ると、なぜパスワードが /etc/shadow に分離されているかがわかります。
$ ls -l /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 1316 Aug 2 17:25 /etc/passwd
-rw-r----- 1 root shadow 935 Aug 2 17:26 /etc/shadow
/etc/passwd は全ユーザーが読めます(r--r--)。ここにハッシュを置いていた時代は、誰でも取り出してオフラインで総当たりができてしまいました。そのため現在はハッシュだけを root と shadow グループしか読めない /etc/shadow へ追い出し、/etc/passwd 側には x というプレースホルダを残しています。
ユーザー一覧を取り出す方法(getent passwd・compgen -u など)は、Linuxユーザー一覧の確認方法で詳しく扱っています。
基本の使い方
自分のパスワードを変更する
引数なしで実行します。管理者権限は不要です。
$ passwd
Changing password for carol.
Current password:
New password:
Retype new password:
passwd: password updated successfully
まず現在のパスワード、続いて新しいパスワードを2回入力します。入力中は画面に何も表示されません(カーソルも動きません)が、正常な動作です。
他ユーザーのパスワードを変更する
ユーザー名を引数に渡します。root 権限が必要なので sudo を付けます。
$ sudo passwd alice
New password:
Retype new password:
passwd: password updated successfully
root が実行する場合、対象ユーザーの現在のパスワードは聞かれません。パスワードを忘れたユーザーのリセットはこの手順で行います。sudo の設定については sudo コマンドの使い方を参照してください。
オプション一覧
passwd --help の出力に対応した一覧です(shadow-utils 版)。
| オプション | 長い形式 | 説明 |
|---|---|---|
-a | --all | 全アカウントの状態を表示(-S と併用) |
-d | --delete | パスワードを削除して空にする |
-e | --expire | 即時に期限切れにし、次回ログイン時の変更を強制 |
-i N | --inactive | 期限切れ後 N 日でアカウントを無効化 |
-k | --keep-tokens | 期限切れの場合のみ変更する |
-l | --lock | パスワードをロックする |
-n N | --mindays | 再変更までの最短日数 |
-q | --quiet | メッセージを抑制する |
-r REPO | --repository | 変更先リポジトリを指定する |
-R DIR | --root | 指定ディレクトリを chroot して実行 |
-S | --status | パスワードの状態を表示 |
-u | --unlock | ロックを解除する |
-w N | --warndays | 期限切れ N 日前から警告する |
-x N | --maxdays | パスワードの最長有効日数 |
他サイトでよく紹介される --stdin は Ubuntu / Debian には存在しません。詳細は後述の「非対話でパスワードを設定する」で扱います。--version も未実装で、passwd --version は unrecognized option になります。
passwd -S の出力の読み方
-S はパスワードの状態を1行で返します。区切りのないスペース区切り7項目で、意味を知らないと読めません。
$ sudo passwd -n 7 -x 90 -w 14 -i 30 carol
passwd: password changed.
$ sudo passwd -S carol
carol P 2026-08-02 7 90 14 30
| # | 値 | 意味 |
|---|---|---|
| 1 | carol | ユーザー名 |
| 2 | P | 状態。P=有効 / L=ロック中 / NP=パスワードなし |
| 3 | 2026-08-02 | 最終変更日 |
| 4 | 7 | 再変更までの最短日数(-n) |
| 5 | 90 | 最長有効日数(-x) |
| 6 | 14 | 期限切れ前の警告日数(-w) |
| 7 | 30 | 期限切れ後の猶予日数(-i。未設定は -1) |
4〜7番目は /etc/shadow の該当フィールドをそのまま表示しているだけです。実際に突き合わせると一致します。
$ sudo grep '^carol:' /etc/shadow | cut -d: -f4-8
7:90:14:30:
-a を付けると全アカウントを一覧できます。システムユーザーがすべて L(ロック)になっているのが確認できます。
$ sudo passwd -a -S | head -5
root L 2026-06-10 0 99999 7 -1
daemon L 2026-06-10 0 99999 7 -1
bin L 2026-06-10 0 99999 7 -1
sys L 2026-06-10 0 99999 7 -1
sync L 2026-06-10 0 99999 7 -1
ロック・解除・削除は /etc/shadow で何が起きているか
-l / -u / -d の違いは、/etc/shadow の2列目(ハッシュ欄)を直接見ると一目でわかります。ユーザー alice で順に実行した実測です。
| 操作 | passwd -S | /etc/shadow の2列目 |
|---|---|---|
| 作成直後(未設定) | alice L ... | ! |
| パスワード設定後 | alice P ... | $y$j9T$3YgNqMC8X2PjRyKbXOa5O0$tfol... |
passwd -l alice | alice L ... | !$y$j9T$3YgNqMC8X2PjRyKbXOa5O0$tfo... |
passwd -u alice | alice P ... | $y$j9T$3YgNqMC8X2PjRyKbXOa5O0$tfol... |
passwd -d alice | alice NP ... | (空文字) |
ポイントは3つです。
-lはハッシュの先頭に!を付けるだけで、元のハッシュは消えません。だから-uで元のパスワードがそのまま復活します。- 作成直後のアカウントも
!だけが入っているため、-Sは同じLを返します。「ロックした」のか「まだ設定していない」のかは-Sだけでは区別できません。 -dはハッシュ欄を空にします。これは「パスワードなしでログインできる」状態であり、ロックとは正反対の危険な設定です。-lのつもりで-dを打たないよう注意してください。
passwd -l は usermod -L と同じ動作(! を付与)です。usermod の他の機能は usermod コマンドを参照してください。
要注意:passwd -l では SSH 鍵認証を止められない
passwd -l は「アカウントを止めるコマンド」として紹介されがちですが、止まるのはパスワード認証だけです。公開鍵認証で SSH ログインできるユーザーは、ロック後もそのまま入れます。実際に sshd を立てて確認しました。
# bob に公開鍵を設定済み。ロック前の鍵認証
$ ssh -o BatchMode=yes bob@127.0.0.1 whoami
bob
# ロックする
$ sudo passwd -l bob
$ sudo passwd -S bob
bob L 2026-08-02 0 99999 7 -1
# ロック後の鍵認証 ← 入れてしまう
$ ssh -o BatchMode=yes bob@127.0.0.1 whoami
bob
一方、パスワード認証はきちんと拒否されます。同じ環境で PasswordAuthentication yes にして試した結果です。
# ロック前
$ ssh -o PreferredAuthentications=password carol@127.0.0.1 whoami
carol
# passwd -l carol の後
$ ssh -o PreferredAuthentications=password carol@127.0.0.1 whoami
Permission denied, please try again.
理由は、sshd の公開鍵認証がパスワードハッシュを一切参照しないためです。! が付いていてもハッシュは照合されないので、鍵さえ authorized_keys にあれば認証が通ります。
確実にログインを止める方法
アカウントを本当に止めたいときは、パスワードではなくアカウント自体を失効させます。usermod -e で失効日を過去に設定するのが確実です。
$ sudo usermod -e 1 bob # 1970-01-02 を失効日にする
$ ssh -o BatchMode=yes bob@127.0.0.1 whoami
Your account has expired; please contact your system administrator.
これなら鍵認証も止まります。用途に応じて使い分けてください。
| 方法 | パスワード認証 | SSH 鍵認証 | 用途 |
|---|---|---|---|
passwd -l | 止まる | 止まらない | 一時的にパスワードだけ無効化 |
usermod -e 1 | 止まる | 止まる | 退職者など確実に締め出す |
usermod -s /usr/sbin/nologin | 認証は通るがシェルが起動しない | 同左 | サービス用アカウント |
authorized_keys の削除 | 影響なし | 止まる | 鍵だけ失効させたい |
退職者アカウントの停止など、確実性が必要な場面では passwd -l と usermod -e の併用、加えて authorized_keys の確認までをセットにしてください。鍵の管理は ssh-keygen コマンドで扱っています。
パスワードの有効期限を設定する
-n / -x / -w / -i で有効期限のポリシーを設定できます。90日で失効、7日間は再変更禁止、14日前から警告、という設定は次の1行です。
$ sudo passwd -n 7 -x 90 -w 14 alice
passwd: password changed.
「password changed」と出ますが、変わったのは有効期限の設定だけで、パスワード本体は変更されていません。紛らわしい表示なので覚えておくと安心です。
なお -n(最短日数)は運用でつまずきやすいオプションです。-n 7 を設定すると、そのユーザーは変更後7日間パスワードを変更できなくなります。
$ passwd # -n 7 が設定された carol 自身が実行
Changing password for carol.
Current password:
You must wait longer to change your password.
passwd: Authentication token manipulation error
passwd: password unchanged
「パスワード漏洩の疑いがあるのですぐ変更したい」という場面で本人が変更できず、root が sudo passwd -n 0 carol で最短日数を戻す必要が出ます。-n は 0 のままにしておくのが無難です。
次回ログイン時に変更を強制する
初期パスワードを配布したあと、本人に必ず変更させたい場合は -e を使います。
$ sudo passwd -e alice
passwd: password changed.
$ sudo passwd -S alice
alice P 1970-01-01 0 99999 7 -1
最終変更日が 1970-01-01 になりました。これは /etc/shadow の3列目(最終変更日)が 0 に書き換えられたためです。
$ sudo grep '^alice:' /etc/shadow | cut -d: -f3
0
$ sudo chage -l alice
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
Account expires : never
passwd と chage の使い分け
passwd | chage | |
|---|---|---|
| パスワード本体の変更 | できる | できない |
| 有効期限の設定 | できる(-n -x -w -i) | できる(-m -M -W -I) |
| アカウント失効日の設定 | できない | できる(-E) |
| 現在の設定の確認 | -S(1行・記号表示) | -l(複数行・日本語的に読める) |
設定は passwd、確認は chage -l、と分けると読み違いが減ります。詳細は chage コマンドを参照してください。
非対話でパスワードを設定する(スクリプト向け)
–stdin は Ubuntu / Debian にはない
「echo pass | passwd --stdin user で自動化できる」という記述をよく見かけますが、これは Red Hat 系(RHEL / CentOS / Rocky など)独自の拡張です。Ubuntu 24.04 で実行すると次のように失敗します。
$ echo 'newpass' | sudo passwd --stdin alice
passwd: unrecognized option '--stdin'
Usage: passwd [options] [LOGIN]
...
$ echo $?
6
終了ステータスは 6 です。スクリプト内で set -e を使っていないと、パスワードが設定されないまま処理が進んでしまうので注意してください。
chpasswd を使う
ディストリビューションを問わず使えるのが chpasswd です。ユーザー名:パスワード を標準入力に渡します。
$ echo 'alice:P@ssw0rd-Test123' | sudo chpasswd
$ sudo passwd -S alice
alice P 2026-08-02 0 99999 7 -1
複数ユーザーをまとめて設定することもできます。
$ sudo chpasswd <<'EOF'
alice:P@ssw0rd-Alice1
bob:P@ssw0rd-Bob2345
EOF
ただしコマンドラインに平文パスワードを書くと、history や ps から見えてしまいます。ヒアドキュメントや、パーミッションを絞ったファイルからのリダイレクトを使い、処理後は速やかに削除してください。
root が実行すると弱いパスワードでも通ってしまう
これは自動化するときに最も見落としやすい落とし穴です。libpam-pwquality によるパスワード強度チェックは、root が実行した場合警告を出すだけで拒否しません。実際に 12345 を設定してみます。
$ echo 'carol:12345' | sudo chpasswd
BAD PASSWORD: The password is shorter than 8 characters
$ echo $?
0
# 設定されてしまっているか、SSH パスワード認証で確認
$ ssh -o PreferredAuthentications=password carol@127.0.0.1 whoami
carol
警告は出るのに終了ステータスは 0、そして 12345 で実際にログインできてしまいました。対して一般ユーザーが自分で設定しようとすると、きちんと拒否されます。
$ passwd # carol 自身が実行
Changing password for carol.
Current password:
New password:
Password change has been aborted.
passwd: Authentication token manipulation error
passwd: password unchanged
つまり「パスワードポリシーを設定したから安全」とは言えません。chpasswd で一括投入するスクリプトを書く場合は、投入前に自前で文字数・文字種をチェックするか、投入後に pwscore で検証する処理を入れてください。pwscore は libpwquality-tools パッケージに含まれ、弱いパスワードには終了ステータス 1 を返します。
$ echo '12345' | pwscore
Password quality check failed:
The password is shorter than 8 characters
$ echo $?
1
あわせて、パスワード強度とは別軸の対策としてログイン試行回数の制限も検討してください。失敗記録の確認・リセットは faillog コマンドで行えます。
よくあるエラーと対処
passwd: Authentication token manipulation error
「パスワードを書き込めなかった」という汎用エラーで、原因が複数あります。
- パスワードポリシーに弾かれた:直前に
BAD PASSWORD:やPassword change has been aborted.が出ていればこれです。より長く複雑なパスワードにしてください。 - 最短変更間隔(
-n)に達していない:直前にYou must wait longer to change your password.が出ていればこれです。sudo passwd -S ユーザー名の4番目の値を確認し、sudo passwd -n 0 ユーザー名で解除します。 - ファイルシステムが読み取り専用:
mount | grep ' / 'でroになっていないか確認します。ディスク障害時に発生します。 - /etc/shadow に immutable 属性が付いている:
lsattr /etc/shadowでiが出たらsudo chattr -i /etc/shadowで外します。 - ディスクが満杯:
df -h /で空き容量を確認します。
passwd: You may not view or modify password information for bob.
$ passwd bob # carol が実行
passwd: You may not view or modify password information for bob.
一般ユーザーが他人のパスワードを操作しようとした場合のエラーです。sudo を付けて実行してください。-S による状態の「表示」も同じく root 権限が必要です。
passwd: user ‘xxx’ does not exist
$ sudo passwd nosuchuser
passwd: user 'nosuchuser' does not exist
$ echo $?
1
ユーザー名のタイプミスか、そもそも作成されていません。getent passwd nosuchuser で存在を確認し、必要なら useradd コマンドで作成します。
You are required to change your password immediately (administrator enforced)
passwd -e が実行されたアカウントでログインすると表示されます。エラーではなく仕様なので、画面の指示どおり新しいパスワードを設定すれば通常どおり使えます。
ただし ssh user@host コマンド のような非対話実行では変更画面を出せないため、Permission denied で弾かれます。cron やデプロイスクリプトで使うアカウントに -e を打たないよう注意してください。
passwd: Permission denied
root 権限が必要な操作を sudo なしで実行した場合に出ます。sudo passwd ... で実行し直してください。sudo 自体が使えない場合は su コマンドで root に切り替えるか、管理者に依頼します。
よくある質問
passwd 入力時に画面に何も出ないのは故障ですか?
正常です。肩越しの覗き見を防ぐため、* すら表示しない仕様になっています。そのまま入力して Enter を押してください。
現在のパスワードを忘れた場合はどうすればよいですか?
root(または sudo 権限を持つ別ユーザー)から sudo passwd ユーザー名 を実行すれば、現在のパスワードを知らなくても再設定できます。root のパスワード自体を忘れた場合は、GRUB のリカバリーモードやシングルユーザーモードでの起動が必要です。
passwd -S が L なのに、まだログインできるのはなぜですか?
SSH の公開鍵認証を使っている可能性が高いです。passwd -l はパスワード認証しか止められません。~/.ssh/authorized_keys を確認し、必要なら sudo usermod -e 1 ユーザー名 でアカウントごと失効させてください。
passwd -d で削除したあとはログインできなくなりますか?
逆です。-d はパスワード欄を空にするため、設定によってはパスワードなしでログインできてしまいます。ログインを止めたい場合は -d ではなく -l や usermod -e を使ってください。
パスワードのハッシュ形式 $y$ は何ですか?
/etc/shadow の2列目の先頭にある $ 区切りの識別子はハッシュアルゴリズムを表します。$y$ は yescrypt で、Ubuntu 22.04 以降の既定です。ほかに $6$(SHA-512)、$5$(SHA-256)、$2y$(bcrypt)があります。
パスワードの状態を一般ユーザーが確認できますか?
自分自身については passwd -S(引数なし)で確認できます。他ユーザーの状態を見るには root 権限が必要です。
関連記事
- useradd コマンド — 新しいユーザーを作成する
- usermod コマンド — 既存ユーザーの設定を変更する
- userdel コマンド — ユーザーを削除する
- chage コマンド — パスワードの有効期限を確認・管理する
- Linuxユーザー一覧の確認方法 —
/etc/passwdやgetentでユーザーを一覧する - su コマンド — 別のユーザーに切り替える
- sudo コマンド — root 権限でコマンドを実行する
- groupadd コマンド — グループを作成する

コメント