Bash脚本IF语句逻辑异常排查:IP未变更时仍触发邮件发送的问题
问题分析与修复:Bash脚本无论IP是否变更都发送邮件的原因
兄弟,我一眼就瞅出问题在哪了——你把sendemail命令的执行时机完全搞错啦!
问题根源
看你脚本里这行代码:
sendIP=$(sendemail -f ... 包含敏感信息的完整语法)
这里的$(...)是Bash的命令替换语法,它会在脚本执行到这一行的时候,立刻运行括号里的sendemail命令,然后把命令的输出结果存到sendIP变量里。也就是说,不管后面的if判断逻辑是什么,这行代码一跑就已经发邮件了!后面的echo $sendIP只是把命令的输出打印出来,根本不是触发发送的动作——邮件早在判断IP之前就已经发出去了。
修复后的脚本
把sendemail命令直接放到if的条件分支里,只在IP变更时才执行它:
#! /bin/bash catvar=$(cat AAA | tail -1 | awk '{ print $2 }') date=$(date +"%d-%m-%y") add1=$(wget -qO- icanhazip.com) # 只有当IP变更时,才执行发送邮件的命令 if [ "$catvar" != "$add1" ]; then sendemail -f ... 包含敏感信息的完整语法 echo "$date $add1" >> AAA else echo same fi
额外优化建议
可以加个小判断处理AAA文件不存在的情况(比如第一次运行脚本时),避免空文件导致catvar为空的异常:
#! /bin/bash date=$(date +"%d-%m-%y") add1=$(wget -qO- icanhazip.com) # 处理文件不存在的初始情况 if [ ! -f AAA ]; then echo "$date $add1" >> AAA sendemail -f ... 包含敏感信息的完整语法 exit 0 fi catvar=$(cat AAA | tail -1 | awk '{ print $2 }') if [ "$catvar" != "$add1" ]; then sendemail -f ... 包含敏感信息的完整语法 echo "$date $add1" >> AAA else echo same fi
另外,有些服务器默认没装wget,可以用curl替代获取公网IP:add1=$(curl -s icanhazip.com)
内容的提问来源于stack exchange,提问作者lane17
相关产品推荐
相关产品推荐

