普通用户用passwd改自己密码需输入旧密码和两次新密码,无需root权限;root可直接为任意用户设新密码;chage -d 0强制用户下次登录改密;chage -l查看密码状态,pam策略可能导致修改失败。

普通用户修改自己密码用 passwd
普通用户登录后,直接运行 passwd 就能改自己的密码,系统会提示输入旧密码和两次新密码。这个操作不需要 root 权限,但必须知道当前密码。
常见错误是输错旧密码导致失败,或者新密码太简单被系统拒绝(尤其开启了 PAM 密码强度策略时)。如果遇到 Authentication token manipulation error,大概率是 /etc/shadow 权限不对或磁盘只读,不是密码输错了。
注意:passwd 默认只改当前用户的密码;加用户名(如 passwd alice)属于管理员行为,普通用户无权执行。
root 修改其他用户密码直接用 passwd username
root 用户可以绕过旧密码验证,直接为任意用户设新密码。比如 passwd bob 回车后输入两次新密码即可生效。
这个操作会立即更新 /etc/shadow 中该用户的密码哈希值,并重置密码过期状态(chage -l bob 可查)。
容易忽略的一点:如果目标用户正在登录中,改完密码不影响其当前会话——SSH 或桌面会话仍保持活跃,直到用户主动登出或超时断开。
强制用户下次登录时修改密码用 chage -d 0
执行 chage -d 0 username 后,该用户下次登录就会被拦住,必须先改密码才能继续。原理是把 /etc/shadow 中的“上次密码修改日期”设为 0,系统认为密码已过期。
适用场景包括:新账号首次启用、员工入职初始化、安全审计后批量重置。
-
chage -d 0不影响当前已登录会话,只对新登录生效 - 如果用户用 SSH 密钥登录且禁用了密码认证,这条命令无效——因为根本不会触发密码修改流程
- 配合
passwd -e username效果相同,但chage更明确体现“日期归零”的语义
检查和调试密码过期策略用 chage -l 和 grep
查某个用户的密码状态:运行 chage -l username,重点关注 Last password change、Password expires、Password inactive 这几行。若显示 never,说明没设过期时间。
批量看所有用户是否被设为“强制改密”:用 sudo awk -F: '$5 == "0" {print $1}' /etc/shadow,它会列出所有“上次修改日期”为 0 的用户名。
真正容易踩坑的是 PAM 配置——如果 /etc/pam.d/common-password 里有 remember=5 这类限制,用户可能无法重复使用近期用过的密码,这时候即使输对了旧密码也会报错,得结合 auth.log 查具体拒绝原因。











