基于New Relic NRI Flex实现多用户密码过期告警遇脚本语法问题
解决New Relic多用户密码过期监控脚本语法错误
原脚本的核心语法问题
你给出的shell脚本有两个致命语法错误:
for user in tomcat fuse wpms oracle do里,do前面必须加分号或者换行,shell语法要求循环列表和do之间必须有明确分隔符- 提取的密码过期日期带前后空格,未做清理会导致后续
date命令解析失败
修正后的可运行脚本
for user in tomcat fuse wpms oracle; do todaydat=$(date +%s) # 提取密码过期日期并去除前后空格 passexpdate=$(chage -l "$user" | grep "Password expires" | awk -F':' '{print $2}' | xargs) # 处理密码永不过期的特殊场景 if [ "$passexpdate" = "never" ]; then expday=-1 passexp=0 else passexp=$(date -d "$passexpdate" +%s) exp=$((passexp - todaydat)) expday=$((exp / 86400)) fi # 输出New Relic可直接解析的指标格式 echo "password_expiry_days,user=$user value=$expday" done
适配New Relic的关键优化
- 用
$()替代反引号,语法更清晰且支持嵌套,避免shell解析歧义 - 给变量加双引号,防止用户名称带特殊字符时出错
- 增加
xargs清理过期日期的前后空格,避免date命令报错 - 新增永不过期场景的处理,防止脚本中断
- 输出采用New Relic兼容的行协议格式,方便YAML配置中直接采集指标,无需额外处理
YAML配置补充提示
确保New Relic集成用户有执行chage -l的权限,可通过sudoers配置免密执行:
newrelic ALL=(ALL) NOPASSWD: /usr/bin/chage -l *
内容的提问来源于stack exchange,提问作者Somesh Sharma
相关产品推荐
相关产品推荐

