Linux下Shell实现服务器IP监测

实验室有一个服务器放在机房,,装的是Ubuntu Server,IP为自动分配,因此一旦IP有变化就无法远程操作,必须去机房记录新的IP。学了几天Shell之后想,是不是可以定时检测其IP的变化,一旦有变化就发送到邮箱呢?。首先分析一下这次任务,无非是几块内容:

1、查询当前IP;

2、查询变化前的IP;

3、如二者不想等则,读取邮件列表;

4、对列表发送邮件;

4. 定时执行脚本;

当然,在学校的上网认证系统大行其道的环境下又加了一条,那就是自动登陆上网认证系统,这又是后话了。

首先是查询当前IP,会点Linux的童鞋们应该对ifconfig不陌生,输入一下得到:

eth0 Link encap:以太网 硬件地址 00:30:48:f9:b7:18 inet 地址:223.2.36.217 广播:223.2.47.255 掩码:255.255.240.0 inet6 地址: fe80::230:48ff:fef9:b718/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:439851 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:410241 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:76752373 (76.7 MB) 发送字节:177467784 (177.4 MB) 中断:16 Memory:faee0000-faf00000lo Link encap:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 跃点数:1 接收数据包:583701 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:583701 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:0 接收字节:179155467 (179.1 MB) 发送字节:179155467 (179.1 MB)

但是我只要其中IP,对于其他一大堆东西不感兴趣,那怎么办。这下就需要我们的grep登场了,grep是文本查找的“高手”,支持正则表达式,它将会返回结果的行。我们观察到我们需要的IP:223.2.36.217的行前面为“inet 地址”,于是我们可以grep "inet 地址"。这样就剩下两行了:

inet 地址:223.2.36.217 广播:223.2.47.255 掩码:255.255.240.0 inet 地址:127.0.0.1 掩码:255.0.0.0

但是还有两行,于是我们可以使用grep -v "127.0.0.1" 反向选择删除localhost,就只剩我们目标行了。

接下来是要获取列,我们观察到目标行分隔是通过:和空格分的,所以咱使用下一个工具,cut,使用cut -d: -f2用:和空格分隔,获取从第二列开始的数组,这就获取了IP。最后使用awk ‘{print $1}’将值赋予IP,于是形成完整的IP获取:

IP=`ifconfig|grep ‘inet 地址’|grep -v ‘127.0.0.1’|cut -d: -f2|awk ‘{print $1}’`

那怎么知道IP有没有变化呢?我的做法就是第一次的时候把IP记录下来,即echo "$IP">IP_CONF,IP_CONF为一个叫ip.conf的文件,每次读这个文件就知道之前的ip了,接下来就是邮件列表,记录net-report.conf,要发邮件的时候从它们里面读取,并发送邮件:

cat $MAIL_LIST|while read mailist do echo "Sending mail to $mailist" echo "New IP is:$IP"|mail -s newIP $mailist done

这就基本完成了, 但是多说一句,首先发送邮件得确定安装sendmail或mailutils,并在/etc/host里面改一下域名。你收到的邮件地址会是你的“用户名@域名”,另外对外网邮箱,现在大多有设置反垃圾机制,尝试了一下qq邮箱和新浪邮箱,均被拦截了。想要收到邮件得设置白名单。

最后是怎么定时执行shell,使用crontab吧,具体的看我转载的文章

下面给出完整的脚本:

#!/bin/bashIP_CONF='ip.conf'MAIL_LIST='net-report.conf'IP=`ifconfig|grep 'inet 地址'|grep -v '127.0.0.1'|cut -d: -f2|awk '{print $1}'`if [ ! -d $IP_CONF ]thentouch $IP_CONFfi#ip is newestOLD_IP=`cat $IP_CONF|grep [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*`echo "IP:$IP OLD_IP:$OLD_IP"if [ -z "$OLD_IP" ] || [ "$OLD_IP" != "$IP" ] thenecho "$IP">$IP_CONFcat $MAIL_LIST|while read mailistdoecho "Sending mail to $mailist"echo "New IP is:$IP"|mail -s newIP $mailistdonefi 用自动化的方式解决最实际的问题,虽然还是很菜,但是很有成就感啊

人生就是要感受美丽的善良的,丑恶的病态的。

Linux下Shell实现服务器IP监测

相关文章:

你感兴趣的文章:

标签云: