请求修正Shell脚本:对比/etc/shadow账户过期日期并处理密码
修复Shell脚本语法错误并实现过期账户密码清除功能
问题说明
原脚本运行时出现语法错误:exppass: line 7: syntax error: unexpected end of file,原因是脚本未完成,缺少if和while结构的闭合语句,同时未正确初始化关键变量、处理/etc/shadow的列读取逻辑。
完整修复脚本
#!/bin/bash # 将当前日期转换为从1970-01-01开始的天数(与/etc/shadow过期日期格式匹配) today=$(($(date +%s)/86400)) # 直接读取/etc/shadow文件,避免不必要的cat管道 while IFS=":" read -r col1 col2 col3 col4 col5 col6 col7 col8 col9; do # 跳过无过期日期(永不过期)的账户 [ -z "$col8" ] && continue expire=$col8 # 判定账户是否已过期 if [ "$expire" -lt "$today" ]; then echo "处理过期账户: $col1" # 清除账户密码,--delete选项会移除密码字段,使账户无密码登录(需结合系统配置) passwd --delete "$col1" fi done < /etc/shadow
关键修复点
- 补充
fi闭合if判断、done闭合while循环,解决语法错误; - 初始化
today变量,将当前时间戳转换为与/etc/shadow一致的天数格式; - 正确赋值
expire为/etc/shadow的第8列(账户过期日期); - 处理无过期日期的账户,避免无效判断;
- 使用文件重定向替代
cat管道,提升脚本效率; - 添加
read -r避免转义字符解析问题; - 增加操作提示,明确当前处理的账户。
内容的提问来源于stack exchange,提问作者Ana C
相关产品推荐
相关产品推荐

