linux下如何去掉密码过期
- Linux
- 2025-07-25
- 5
Linux系统中,若需去掉密码过期限制(即设置密码永不过期),可通过多种方法实现,以下是详细的操作步骤及注意事项:
通过 chage 命令修改用户密码策略
-
查看当前配置
使用 chage -l <用户名> 查看指定用户的密码过期策略。
chage -l tmn输出结果中会显示 maxdays(最大有效天数)、lastday(上次修改日期)等字段,若未设置永不过期,则这些值通常为具体数字或默认系统策略。
-
设置密码永不过期
执行以下命令将用户的密码有效期设为无限长:
sudo chage -M -1 <用户名>-M 表示修改最大生存周期,-1 代表永不过期,此命令还会同步更新 /etc/shadow 文件中对应的字段。
-
验证生效结果
再次运行 chage -l <用户名>,若看到 password expires : never,则说明配置成功。

-
批量调整其他参数(可选)
如需同时禁用最小更改间隔、警告期等功能,可组合多个选项:
sudo chage -m 0 -M -1 -I -1 -E -1 <用户名>各参数含义:
- -m 0:取消最小密码使用天数限制;
- -I -1:忽略密码失效前的预警期;
- -E -1:移除账户自动失效日期。
直接编辑 /etc/shadow 文件
此方法直接操作存储用户认证信息的文本文件,风险较高但灵活性更强。
-
备份原始文件
修改前务必先备份:
-
用文本编辑器打开文件
推荐使用 nano 或 vim:
sudo nano /etc/shadow ``` 格式如下(以冒号分隔的多个字段): ```plaintext 用户名:加密后的密码哈希值:上次修改时间戳:最小间隔天数:最短存活时间:过期前警告天数:超期宽限天数:账号失效日期:保留字段
例如某行可能类似:
tmn:$6$randomhashedstring...:18723:0:99999:7:::
-
定位目标用户并修改关键字段
- 第5个字段(max_age):将其改为 -1 表示密码永不过期,例如原值为 99999 时,直接替换为 -1。
- 其他相关字段建议同步调整:如将 min_age(第4个字段)也设为 0,避免因历史记录导致意外冲突。
-
保存退出并重启PAM服务(部分发行版需要)
若基于Debian/Ubuntu系统,可能需要重新加载认证模块:
sudo systemctl restart PAM -
单步完成设置
sudo usermod -p "" -e -1 <用户名>参数说明:
- -p "":清空加密后的密码占位符(实际不改变原密码);
- -e -1:将账户失效日期设为无穷大。
-
结合 passwd 确保一致性
如果后续仍需保留原有密码强度规则,可补充执行:
sudo passwd -x -1 <用户名>-x 明确指定不强制过期。
使用 usermod 命令快速配置
适用于熟悉命令行工具的管理员场景。

️ 重要注意事项与风险提示
潜在风险 应对建议 安全隐患 仅对非交互式服务账户启用该策略;普通用户应保持定期改密习惯 误操作导致登录失败 始终先备份再修改;优先使用 chage 而非手动编辑文件 违反企业安全合规要求 确认组织的安全基线是否允许例外情况,必要时提交审批流程 SELinux策略干扰(少数环境) 遇到权限错误时检查上下文标签,或尝试临时关闭SELinux进行调试
FAQs(常见问题解答)
Q1: 为什么修改后用户仍然收到密码过期提示?
可能原因:存在多个重叠的策略配置,例如某些发行版默认启用了PAM模块强制检查。
解决方案:检查 /etc/pam.d/common-password(Debian系)或 /etc/pam.d/system-auth(RHEL系),添加一行 password sufficient pam_unix.so nullok use_authtok 来覆盖默认行为。
Q2: 如何批量处理多个用户的密码过期策略?
高效脚本示例:
#!/bin/bash for user in $(cat userlist.txt); do sudo chage -M -1 "$user" >/dev/null 2>&1 done echo "All specified accounts have been configured with non-expiring passwords."
将需要处理的用户名逐行列在 userlist.txt 文件中