修改密码后旧密码仍能登录,说明新密码未生效或系统绕过密码验证:可能因/etc/shadow被设i属性导致写入失败、pam/ssh配置跳过密码校验、chage -d 0触发强制改密流程、公钥认证静默生效,或日志显示实际使用密钥而非密码认证。

修改密码后旧密码还能登录,说明新密码没生效,或者系统仍在用旧凭证验证。这不是“密码改成功了但登不进”,而是“改了像没改”——更隐蔽,也更危险。
检查 /etc/shadow 中密码哈希是否真的更新了
passwd 命令只在写入哈希成功时才报“success”,但它可能写到了错误位置,或被其他进程覆盖。直接比对 root 或目标用户的 shadow 条目:
- 执行 sudo grep '^username:' /etc/shadow(把 username 换成实际用户名)两次:一次改密前、一次改密后(若还能登录),看第二字段(密码哈希)是否变化;
- 如果哈希完全一样,说明 passwd 根本没写进去——常见于 /etc/shadow 被设了 i 属性(不可修改);用 lsattr /etc/shadow 查看,若输出含 i,则需先 chattr -i /etc/shadow 再重试 passwd;
- 如果哈希变了,但旧密码仍能过认证,问题大概率出在 PAM 或 SSH 配置绕过了 shadow 验证(比如启用了 PAM 的 pam_permit.so 或配置了 auth [success=ok] 行跳过密码检查)。
确认没有启用“密码过期强制重设”机制干扰验证
某些场景下,管理员会用 chage -d 0 username 强制用户下次登录改密。这个操作本身不改密码,但会让系统在用户输入任意有效密码(包括旧密码)后,不进入 shell,而是立即要求改密——看起来像“旧密码能登”,实则是登录流程被中断。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 运行 sudo chage -l username,检查 “Password expires” 和 “Last password change” 字段;
- 如果 “Last password change” 是很久以前的日期,而 “Password expires” 显示为 “Jan 01, 1970” 或 “never”,但 “Password must be changed” 却是 “yes”,说明该账户正处在强制改密状态;
- 此时用户输旧密码能通过认证,但卡在改密环节,不是真正“登录成功”。解除只需 sudo chage -d -1 username(-1 表示永不过期)。
排查 SSH 是否启用了免密登录或密钥优先认证
很多人以为自己在输密码,其实 SSH 已静默使用了公钥认证——根本没走密码校验流程。这会造成“改了密码,但旧密码(甚至任意密码)都能登”的错觉。
- 登录后立刻执行 echo $SSH_CONNECTION,若有输出,再查当前会话是否用了密钥:ssh-add -l(有输出表示本地密钥已加载);
- 检查服务端配置:sudo grep -E '^(PubkeyAuthentication|PasswordAuthentication)' /etc/ssh/sshd_config;若 PubkeyAuthentication yes 且 PasswordAuthentication no,那密码修改完全不影响登录;
- 临时验证:用 ssh -o PubkeyAuthentication=no user@host 强制禁用密钥,看是否还需输密码;若此时提示输密码且旧密码无效、新密码有效,就坐实了是密钥在“背锅”。
查看 /var/log/secure 日志确认实际认证路径
日志不会说谎。每次登录尝试,sshd 都会在 /var/log/secure(或 /var/log/auth.log)里记下到底用了哪种方式认证。
- 执行 sudo tail -20 /var/log/secure | grep 'Accepted';
- 如果看到类似 Accepted publickey for root,说明是密钥登录;
- 如果看到 Accepted password for root,再对比时间戳和你改密的时间——若改密后仍出现“Accepted password”且用户是自己,说明密码确实生效了,旧密码不该再通过;此时应怀疑是否有多个同名用户、或 pam_faildelay 等模块缓存了旧结果;
- 注意:SELinux 或 audit 规则有时会抑制日志,若日志空或不全,可临时用 sudo ausearch -m avc -ts recent 辅助排查权限拦截。










