正确方式是用chage -e设置账号绝对过期日期,其值为自1970-01-01起的天数;直接编辑/etc/shadow第8字段风险高,需避免;该字段为截止日而非倒计时,过期后密码认证即时拒绝。

直接修改 /etc/shadow 第8字段(expire_date)是配置账号绝对过期时间的正确方式,但必须用自1970-01-01起的天数(即“Unix纪元天数”),不能填日期字符串或倒计时天数。
第8字段含义与取值规则
该字段格式为:username:pwd_hash:...:...:...:...:...:<strong>expire_date</strong>,其中 expire_date 是一个正整数,表示账号**永久禁用的日期(含当天)**,单位是自1970-01-01起的完整天数。若为空或0,表示永不过期;若为负数,效果未定义(多数系统忽略)。
- 例如:2025-06-30 对应的天数可用命令计算:
date -d "2025-06-30" +%s | awk '{print int($1/86400)}' - 结果是
19873(以2025-06-30为例,实际请按需重算) - 设置后,该用户在当日 00:00:00 起无法登录(包括SSH、console、su等),且无法通过密码重置绕过
安全修改步骤(严禁直接vi编辑)
手动编辑 /etc/shadow 风险极高,极易因格式错误导致系统无法登录。推荐使用 chage 命令——它会自动校验并安全更新第8字段:
- 查当前设置:
chage -l username - 设绝对过期日(如2025-06-30):
chage -E "2025-06-30" username - 验证是否生效:
sudo grep "^username:" /etc/shadow | cut -d: -f8应输出对应天数(如19873)
注意:不要用 echo 或 sed 直接写入 /etc/shadow —— 缺少锁机制和格式校验,可能破坏文件结构导致所有用户无法认证。
批量为离职员工配置(脚本化示例)
若需为多个员工按“离职日”统一设限,可写简明脚本:
#!/bin/bash
# 文件格式:username,2025-06-30
while IFS=',' read -r user expire_date; do
[ -z "$user" ] && continue
if id "$user" &>/dev/null; then
chage -E "$expire_date" "$user" 2>/dev/null && \
echo "✅ $user → expires on $expire_date"
else
echo "❌ $user not found"
fi
done <p>确保输入日期格式为 <code>YYYY-MM-DD</code>,<code>chage</code> 内部会完成天数换算,无需手动计算。</p><h3>关键提醒:这不是“倒计时”,而是“截止日”</h3><p>第8字段不支持动态倒计时(如“30天后过期”)。所谓“离职倒计时”,必须提前换算成目标日期再设置。若员工离职日变动,需重新运行 <code>chage -E</code> 更新。</p><p>该机制由 PAM 模块 <code>pam_unix.so</code> 在每次认证时检查,无需重启服务,生效即时。过期后用户仍可存在,但所有基于密码的认证路径均拒绝访问。</p>











