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
选项在脚本中设置密码,因为密码可能会在进程列表中可见 - 使用
pwgen
或openssl rand
命令生成随机密码