passwd命令

passwd 命令 #

passwd命令用于设置或更改用户账户的密码。它是 Linux 系统中用户管理的基本命令之一,允许用户更改自己的密码,而系统管理员可以更改任何用户的密码。

语法 #

passwd [选项] [用户名]

如果不指定用户名,则更改当前用户的密码。

常用选项 #

选项 描述
-a, --all 显示所有用户的密码状态(与-S一起使用)
-d, --delete 删除用户密码(使账户无密码)
-e, --expire 强制用户在下次登录时更改密码
-i, --inactive 天数 设置密码过期后账户被禁用前的天数
-l, --lock 锁定用户账户(禁止用户登录)
-n, --minimum 天数 设置两次密码更改之间的最小天数
-q, --quiet 安静模式
-r, --repository 仓库 在指定的仓库中更改密码
-S, --status 显示账户的密码状态
-u, --unlock 解锁用户账户
-w, --warning 天数 设置密码过期前的警告天数
-x, --maximum 天数 设置密码的最大有效天数
--stdin 从标准输入读取新密码(用于脚本)

常见用法 #

1. 更改当前用户的密码 #

passwd

系统会提示输入当前密码,然后输入新密码两次。

2. 更改指定用户的密码(需要 root 权限) #

sudo passwd username

系统会提示输入新密码两次。

3. 显示用户的密码状态 #

passwd -S username

输出示例:

username P 2023-01-15 0 99999 7 -1

字段含义:

  • 用户名
  • 密码状态(P=有密码,L=锁定,NP=无密码)
  • 上次更改密码的日期
  • 最小密码年龄(天数)
  • 最大密码年龄(天数)
  • 密码过期前的警告期(天数)
  • 密码过期后的宽限期(天数)

4. 显示所有用户的密码状态 #

passwd -Sa

5. 锁定用户账户 #

sudo passwd -l username

这将在密码前添加一个感叹号,防止用户登录。

6. 解锁用户账户 #

sudo passwd -u username

7. 删除用户密码 #

sudo passwd -d username

这将删除用户的密码,使账户无密码(不安全)。

8. 强制用户下次登录时更改密码 #

sudo passwd -e username

9. 设置密码的最大有效期 #

sudo passwd -x 90 username

这将设置密码 90 天后过期。

10. 设置密码更改的最小间隔 #

sudo passwd -n 7 username

这将要求用户在更改密码后至少等待 7 天才能再次更改。

11. 设置密码过期前的警告期 #

sudo passwd -w 7 username

这将在密码过期前 7 天开始警告用户。

12. 设置密码过期后的宽限期 #

sudo passwd -i 3 username

这将允许用户在密码过期后 3 天内仍然可以登录并更改密码。

在脚本中使用 passwd #

在脚本中设置密码(不推荐,但有时需要):

echo "newpassword" | passwd --stdin username

注意:--stdin选项在某些发行版中可能不可用。

密码策略 #

密码策略通常由 PAM(可插拔认证模块)控制,配置文件位于:

  • /etc/pam.d/passwd:passwd 命令的 PAM 配置
  • /etc/security/pwquality.conf:密码质量要求(在使用 pam_pwquality 模块的系统上)
  • /etc/login.defs:密码过期策略

相关文件 #

  • /etc/passwd:用户账户信息
  • /etc/shadow:加密的密码和账户过期信息
  • /etc/pam.d/passwd:passwd 命令的 PAM 配置

相关命令 #

  • chage:更改用户密码过期信息
  • usermod:修改用户账户
  • useradd:创建新用户
  • userdel:删除用户
  • gpasswd:管理组密码

实用示例 #

1. 设置强密码策略 #

编辑/etc/security/pwquality.conf文件:

minlen = 12         # 最小长度
minclass = 3        # 至少包含3类字符(大写、小写、数字、特殊字符)
dcredit = -1        # 至少1个数字
ucredit = -1        # 至少1个大写字母
lcredit = -1        # 至少1个小写字母
ocredit = -1        # 至少1个特殊字符
difok = 5           # 与旧密码至少有5个字符不同
enforce_for_root    # 对root用户也强制执行策略

2. 批量设置密码过期 #

# 为所有普通用户设置90天密码过期
for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
    passwd -x 90 -w 7 -i 3 $user
done

3. 检查弱密码 #

使用john工具检查系统中的弱密码:

sudo john --wordlist=/path/to/wordlist /etc/shadow

4. 生成随机密码并设置 #

# 生成随机密码
PASSWORD=$(openssl rand -base64 12)

# 设置用户密码
echo "$username:$PASSWORD" | sudo chpasswd

# 显示生成的密码
echo "用户 $username 的新密码是: $PASSWORD"

故障排除 #

1. 密码不符合策略要求 #

错误消息:BAD PASSWORD: The password fails the dictionary check

解决方法:

  • 使用更复杂的密码,包含大小写字母、数字和特殊字符
  • 检查系统的密码策略要求

2. 认证令牌操作错误 #

错误消息:passwd: Authentication token manipulation error

可能的原因:

  • 文件系统只读
  • /etc/shadow文件权限问题
  • PAM 模块配置问题

解决方法:

# 检查文件系统状态
mount | grep " / "

# 检查shadow文件权限
ls -l /etc/shadow

# 修复权限
sudo chmod 0640 /etc/shadow
sudo chown root:shadow /etc/shadow

3. 密码锁定 #

如果用户多次输入错误密码,账户可能被锁定。

解决方法:

# 解锁账户
sudo pam_tally2 --user=username --reset

提示 #

  • 使用强密码,包含大小写字母、数字和特殊字符
  • 定期更改密码,特别是对于特权账户
  • 不要在多个系统上使用相同的密码
  • 使用-e选项强制用户在首次登录时更改默认密码
  • 系统管理员可以更改任何用户的密码,无需知道原密码
  • 使用chage -l username命令查看详细的密码过期信息
  • 在生产环境中,考虑使用密码管理器或集中式认证系统
  • 避免使用--stdin选项在脚本中设置密码,因为密码可能会在进程列表中可见
  • 使用pwgenopenssl rand命令生成随机密码