You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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模块是按顺序执行的,你的配置执行流程是:

  1. pam_pwquality.so检查密码复杂度,允许重试3次
  2. pam_unix.so已经完成了密码修改操作(把新密码写入系统)
  3. 后续的pam_permit.so确保返回成功状态
  4. 最后才轮到pam_pwhistory.so检查密码历史,发现新密码可能在历史列表中,返回错误

这就导致了:密码已经被pam_unix.so修改成功,但后续的pam_pwhistory.so报错让passwd命令输出了“密码未修改”的错误信息,形成了输出和实际结果不符的矛盾。

解决方法:调整PAM模块顺序

你需要把pam_pwhistory.so移到密码修改操作之前,这样就能在修改密码前先检查历史,避免修改后才报错的情况:

  1. 打开common-password文件编辑:
    sudo nano /etc/pam.d/common-password
    
  2. 找到那行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
    
  3. Ctrl+O保存,Ctrl+X退出编辑器

之后再执行passwd命令修改密码,就会先检查密码复杂度和历史记录,只有通过检查才会执行密码修改,命令输出和实际结果就能保持一致了。

备注:内容来源于stack exchange,提问作者droritzz

火山引擎 最新活动