检测IP脚本,自动发邮件,OpenWrt专属!Linux通用!

本脚本用于探测路由wan口IP是否发生改变,如发生改变即发邮件通知管理员;适用于有公网IP玩端口映射(服务器、Nas等)并且动态域名不太稳定的童鞋们。试想想,按照运营商PPoE连接规则,每48小时强制性重新认证(即更换wan口的IP),此时花生壳类的动态域名不一定能瞬时更新得过来,又或者动态域名服务器或动态域名服务进程不稳定或者突然断电等其他因素导致起不来了,如果你出门在外就无法得知你家里公网IP,你映射的端口全部用不了,nas或者搭建私有云的童鞋可能会造成严重不协调。
如果你不在现场而手机突然收到该脚本发送的邮件,那么你的设备可能发生了两件事,第一是刚停电后又恢复了,第二是wan口的动态IP到期(48小时强制更换了)。为了更好判断是否断电造成,我在脚本加入了获取系统启动时间,如果是断电,启动时间肯定在几分钟(视crontab任务而定,建议几分钟一次,提高时效性、准确性嘛!)

本脚本分两部分,其实可以合成一个的,不过分开会更清晰明确,且更合适于改造属于自己想要的功能;第一个脚本是用于检测IP,并判断是否发生了变化。第二个脚本用于发送邮件,当脚本一检测到IP变化将自动触发脚本二去发送邮件。

一、运行环境
执行脚本之前,需要完善几样东西
1、curl #这是探测IP核心命令
2、sendmail #邮件发送程序
3、msmtp #邮件程序核心

如果你的设备是Openwrt,那以上三个工具可以这样安装(用curl举例):

    opkg update
    opkg list |grep curl
    opkg install curl XX

简单粗暴的办法,通过opkg在线检测更新列表然后在列表里面查找对应的应用包,然后install上去,后面的XX指特殊版本,具体视个人而定。

安装好msmtp后需要配置,我先放上我的配置:
root@OpenWrt:/bin# cat /etc/msmtprc

account default
host smtp.163.com
port 25
from abcdefg@163.com #自己改邮箱账户
auth login
tls off
user abcdefg@163.com #自己改邮箱账户
password 12345678 #自己改密码
account default 163-mail

这里是内置在系统的邮箱,邮箱我推荐163,其次一定要把POP3/SMTP/IMAP打开,此处的密码为POP3/SMTP/IMAP设置的客户端授权码,非网页登录邮箱密码!POP3/SMTP/IMAP设置具体看下图:
1.png


2.png


二、赋上脚本

脚本1:

root@OpenWrt:~# cat /bin/ipcheck.sh

#!/bin/sh
file_name="/var/log/ipcheck.log"
iplog="/var/log/ip.log"
iptmp="/var/log/iptmp.log"
ipnull="/var/log/ipnull.log"
c=$(curl icanhazip.com)
d=`cat /var/log/ipnull.log|head -n1`
if [ "$c" = "$d" ];then
     riqi=`date +%Y-%m-%d-%H:%M:%S`
     echo $riqi --------------------curl icanhazip.com is failed!--------------------  >>$file_name
     exit 0
else
     echo New IP: $c > $iptmp
     sleep 2
     a=`cat /var/log/iptmp.log|head -n1`
     b=`cat /var/log/ip.log|head -n1`
     if [ "$a" = "$b" ];then
          exit 0
     else          
          shijian=`date +%Y-%m-%d-%H:%M:%S`
          echo $shijian IP changes! The message has been triggered!!!!  >>$file_name
          echo $a  > $iplog
          echo $(cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("System Uptime: %dday-%dhour--%dmin---%dsecond",run_days,run_hour,run_minute,run_second)}') >> $iplog          
          echo Error time : $shijian  >>$iplog
          sleep 3
          . /bin/email.sh 
     fi
fi       
exit 0

脚本一是需要借用icanhazip.com来获取外网ip,故此会收到icanhazip.com网络质量影响,经实践,一天下来可能会失败几次,失败的时候获取到的东西是空白,这样会导致发送空邮件;因此,这里的ipnull.log是一个空文件,当icanhazip.com不稳定探测失败的时候就跟空文件一样,此时程序会记录失败信息并退出脚本,等待下一轮定时任务执行。
iptmp.log是一个实时读写日志,程序每一次获取ip都会重定向到这个日志当中。
/var/log/ipcheck.log是记录IP更改并触发发送邮件事件;而/var/log/ip.log用于当上次检测的IP与当前检测IP不同时记录当前检测的IP,顺便记录系统运行时长。
以上log命名、存储位置可随意改


脚本二:

# !/bin/sh  
from_name="WangYouGX"  
from="www.wangyougx.com"  
to="abcddf@qq.com"  
email_title="OpenWrt Status"  
email_content="/var/log/ip.log"  
email_subject="OpenWrt Status"  
  
echo -e "To: \"${email_title}\" <${to}>\nFrom: \"${from_name}\" <${from}>\nSubject: ${email_subject}\n\n`cat ${email_content}`" | /usr/sbin/sendmail -t

脚本二为邮件发送脚本,其中,发邮件的内容为/var/log/ip.log的所有内容,to="abcddf@qq.com" 这里的邮箱地址为收件人邮箱地址,email_subject="OpenWrt Status"这个是邮件主题,from_name="WangYouGX" 这个是发件人。

最有crontab任务将脚本一定期每3分钟执行一次,具体语句:

*/3 * * * * sh /bin/ipcheck.sh

三、执行效果图
1、ipcheck.log效果

3.png

2、ip.log发送邮件效果

Screenshot_20161006-195311.png

已有 7 条评论
  1. it之家 it之家

    酱油通道

  2. 大菠萝 大菠萝

    very good~

  3. wang wang

    debian 9 无效,163发短信要输入验证吗,后来又试了几次,验证码都不发送了。

    1. 理论上是可行的,可能你没开启pop、smtp协议,,,邮箱网页版配置里设置

      1. 左手饭特稀 左手饭特稀

        请问那两个脚本放在哪里呀?
        怎么设置呀。

        1. 脚本一: /bin/ipcheck.sh
          脚本二: /bin/email.sh

  4. nice,照着做实现了。

    之前用直接路由器wan口变化有脚本,设置的访问某个php页面发短信通知变动信息。

添加新评论