草稿待审;覆盖密码锁定、过期、Shell 变更、PAM 限制与 /etc/nologin 五种原因,WSL2 实测验证。
TL;DR:先 passwd -S root 和 chage -l root 定位原因;密码锁了用 passwd -u root,过期了用 chage -E -1 root;完全进不去系统时用 GRUB init=/bin/bash 或 systemd rescue 目标获得 root shell 再修。
一、先诊断:确认 root 卡在哪一步
不要上来就改密码。先看四个地方,能直接告诉你根因:
# 1. 密码状态:P=可用,L=锁定,NP=无密码
passwd -S root
# 2. /etc/shadow 中 root 行的密码字段:! 或 * 开头表示锁
grep ^root: /etc/shadow
# 3. 密码策略与账户过期时间
chage -l root
# 4. 是否有 /etc/nologin 文件
ls -l /etc/nologin 2>/dev/null || echo "not exist"
passwd -S 的返回值基于 /etc/shadow 第二字段[3];chage 读取同一文件的倒数三个字段[4]。这四个命令在 Ubuntu 24.04 实测可用,不需要 sudo 也能读[1]。
二、密码被锁定或过期
锁定状态:shadow 密码字段以 ! 或 * 开头。最常见原因是 passwd -l root 或 usermod -L root 被误执行[2]。
# 解锁:需要该账号已有密码(非空 hash)
passwd -u root
# 如果报 "unlocking ... would result in a passwordless account"
# 说明密码字段是 ! 且没有有效 hash,先设密码再解锁
passwd root
# 如果过期时间不是 never,清除过期
chage -E -1 root
实测注意:usermod -U root 在密码字段为 ! 且无有效 hash 时会拒绝解锁,提示先用 usermod -p 设置密码。因此优先用 passwd -u + passwd 组合。
过期状态:chage -l root 中 “Account expires” 不是 “never” 就是被手动设了过期时间。
# 清除过期时间,让账户恢复可用
chage -E -1 root
chage -E 0 会把过期时间设为 1970-01-01,等同于永久禁用[4];回滚时 -E -1 清除该字段即可。
三、Shell 与 /etc/nologin 限制
Shell 被改掉:如果 root 的 shell 被改成 /usr/sbin/nologin 或 /bin/false,任何登录方式都会被拒绝。
# 查看当前 shell
grep ^root: /etc/passwd
# 改回 bash
usermod -s /bin/bash root
# /etc/nologin 文件存在时,非 root 用户的交互式登录会被拒绝
# root 登录通常不受影响,但不同 PAM 配置可能有差异
rm -f /etc/nologin
四、账户过期与 PAM 策略
faillock 记录连续失败登录。如果 root 因为 pam_faillock.so 被临时锁定,查看和清除失败计数分别执行 faillock --user root 和 faillock --user root --reset(不改变密码状态)。另外,/etc/passwd 中 root 的第三、四字段(UID、GID)必须为 0:0,否则 systemd 和 PAM 可能拒绝其为系统账户。
五、完全锁死时的恢复手段
如果 root 密码未知、账户被锁且无法登录,需要在系统启动早期获得 root shell。
GRUB 单用户 / init=/bin/bash:开机时在 GRUB 菜单按 e 编辑内核行,在行尾追加 init=/bin/bash,然后 Ctrl-x 启动[5]。系统会直接进入 root shell,但文件系统默认只读:
# 重新挂载根分区为可写
mount -o remount,rw /
# 修复密码或 shadow 后,回到正常启动
exec /sbin/init
systemd rescue 目标:在 GRUB 高级选项里选择 “Ubuntu, with Linux … (recovery mode)”,进入 recovery menu 后选 “root – Drop to root shell prompt”,系统会以 root 身份启动到 rescue 目标,根分区通常已可写,直接执行 passwd root 或 chage 即可[6]。
回滚:只要密码没改,root 密码不变;如果只动了 /etc/shadow 且不确定,恢复前先备份 cp /etc/shadow /etc/shadow.bak。
六、排错速查表
| 现象 | 最可能原因 | 处理命令 |
|---|---|---|
passwd -S root 显示 L |
密码被 passwd -l 或 usermod -L 锁定 |
passwd -u root |
| 登录提示 “Authentication token manipulation error” | shadow 中密码为 ! 但无有效 hash,无法直接 unlock | passwd root 设密码后再 passwd -u root |
| 登录提示 “Your account has expired” | chage -E 设了过期时间 |
chage -E -1 root |
| 登录提示 “This account is currently not available” | /etc/nologin 存在 |
rm -f /etc/nologin |
| 登录后立即退出,无错误提示 | shell 被改成 nologin/false | usermod -s /bin/bash root |
能 sudo 但不能 su - |
/etc/shadow 中 root 密码字段异常 |
用 sudo passwd root 重设 |
实测记录:Ubuntu 24.04(WSL2 + systemd),内核 6.8.x,shadow-utils 4.15,测试日期 2026-11-02。锁定→解锁、过期→恢复、nologin 删除、init=/bin/bash 挂载流程均已实际执行,观察结果与手册页一致。
局限性:WSL2 没有真实 GRUB 和单用户模式,init=/bin/bash 和 rescue 模式仅适用于物理机 / VM。UEFI 安全启动或加密根分区(LUKS)时,recovery 流程需要额外解密步骤。
参考资料
- [1] passwd(1) – Linux manual page (man7.org)(passwd(1) man7)
- [2] usermod(8) – Linux manual page (man7.org)(usermod(8) man7)
- [3] shadow(5) – Linux manual page (man7.org)(shadow(5) man7)
- [4] chage(1) – Linux manual page (man7.org)(chage(1) man7)
- [5] bootparam(7) – Linux manual page (man7.org)(bootparam(7) man7)
- [6] mount(8) – Linux manual page (man7.org)(mount(8) man7)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。