Ubuntu 20.04服务器passwd命令输出与实际密码修改结果不符的问题咨询
Ubuntu 20.04服务器passwd命令输出与实际密码修改结果不符的问题咨询
嘿,你遇到的这个矛盾情况其实是PAM(Pluggable Authentication Modules)模块执行顺序搞出来的小乌龙,我来帮你捋清楚问题根源,以及怎么解决。
你的问题回顾
你在Ubuntu 20.04服务器上执行passwd命令修改当前用户密码,命令输出提示:
Password has been already used. Choose another.
passwd: Have exhausted maximum number of retries for service
passwd: password unchanged
但实际情况是新密码已经生效——用旧密码登录被拒绝,新密码能正常登录。同时你提供了/etc/pam.d/common-password的配置内容。
问题根源:PAM模块执行顺序错误
看你给出的common-password配置,最后一行额外添加了:
password required pam_pwhistory.so remember=5
这个模块的作用是禁止使用最近5个用过的密码(防止重复密码),但问题出在它的执行位置:它被放在了所有密码修改相关模块的最后。
PAM模块是按顺序执行的,你的配置执行流程是:
pam_pwquality.so检查密码复杂度,允许重试3次pam_unix.so已经完成了密码修改操作(把新密码写入系统)- 后续的
pam_permit.so确保返回成功状态 - 最后才轮到
pam_pwhistory.so检查密码历史,发现新密码可能在历史列表中,返回错误
这就导致了:密码已经被pam_unix.so修改成功,但后续的pam_pwhistory.so报错让passwd命令输出了“密码未修改”的错误信息,形成了输出和实际结果不符的矛盾。
解决方法:调整PAM模块顺序
你需要把pam_pwhistory.so移到密码修改操作之前,这样就能在修改密码前先检查历史,避免修改后才报错的情况:
- 打开
common-password文件编辑:sudo nano /etc/pam.d/common-password - 找到那行
password required pam_pwhistory.so remember=5,把它移动到pam_pwquality.so的下方、pam_unix.so的上方,调整后的Primary block应该是这样:# here are the per-package modules (the "Primary" block) password requisite pam_pwquality.so retry=3 password required pam_pwhistory.so remember=5 password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512 - 按
Ctrl+O保存,Ctrl+X退出编辑器
之后再执行passwd命令修改密码,就会先检查密码复杂度和历史记录,只有通过检查才会执行密码修改,命令输出和实际结果就能保持一致了。
备注:内容来源于stack exchange,提问作者droritzz




