check_server_ip_conflict.sh

使用arping获取对应IP地址的MAC地址,如果和预料的不一致则报警;

#!/bin/bash

epg_addr_01="00:50:56:B7:64:2A"
epg_addr_02="00:50:56:B7:44:43"
vod_addr_01="00:50:56:B7:28:AB"
vod_addr_02="00:50:56:B7:02:6C"

epg_ip_01="10.108.144.1"
epg_ip_02="10.108.144.2"
vod_ip_01="10.108.144.3"
vod_ip_02="10.108.144.4"
epg_vip="10.108.144.5"
vod_vip="10.108.144.6"

log_check="/var/log/sunlight/check_ip_conflict.log"
log_time=$(date "+%Y/%m/%d %H:%M:%S")
log_date=$(date "+%Y%m%d")

event_check=0

function send_email()
{
  echo " " >> $log_check
  ping_count=$(ping -W 3 -c 1 baidu.com | grep ttl | wc -l)
  if [ $ping_count -eq 1 ];then
    echo "[ info ] Begin to send mail......" >> $log_check
    echo "[ info ] `date "+%Y/%m/%d %H:%M:%S"` send mail content : $1" >> $log_check
    if [ -f /sunlight/python/slt_send_mail.py ];then
      python /sunlight/python/slt_send_mail.py "$1"
      if [ $? -eq 0 ];then
        echo "[ SUCCESS ] `date "+%Y/%m/%d %H:%M:%S"` send mail finished!" >> $log_check
      else
        echo " [ Error ] `date "+%Y/%m/%d %H:%M:%S"` send mail failed! " >> $log_check
      fi
    else
      echo " [ Error ] `date "+%Y/%m/%d %H:%M:%S"` /sunlight/python/slt_send_mail.py does not exist! " >> $log_check
    fi
  else
    echo " [ Error ] `date "+%Y/%m/%d %H:%M:%S"` can't connect to the Internet! " >> $log_check
  fi
}

function send_email_use_epg()
{
  echo " " >> $log_check
  ping_count=$(ssh -o StrictHostKeyChecking=no -i /usr/local/sunlight/sshkeys/init.pk -p2222 10.108.144.1 "ping -W 3 -c 1 baidu.com | grep ttl | wc -l")
  if [ $ping_count -eq 1 ];then
    echo "[ info ] Begin to send mail......" >> $log_check
    echo "[ info ] `date "+%Y/%m/%d %H:%M:%S"` send mail content : $1" >> $log_check
    ssh -o StrictHostKeyChecking=no -i /usr/local/sunlight/sshkeys/init.pk -p2222 10.108.144.1 "python /sunlight/python/slt_send_mail.py \"$1\""
    if [ $? -eq 0 ];then
      echo "[ SUCCESS ] `date "+%Y/%m/%d %H:%M:%S"` send mail finished!" >> $log_check
    else
      echo " [ Error ] `date "+%Y/%m/%d %H:%M:%S"` send mail failed! " >> $log_check
    fi
  else
    echo " [ Error ] `date "+%Y/%m/%d %H:%M:%S"` can't connect to the Internet! " >> $log_check
  fi
}

while true
do
  echo " " >> $log_check
  echo "-----------------------------------------------" >> $log_check

  check_epg_01_ip=$( ip addr | grep $epg_ip_01 | wc -l)
  if [ $check_epg_01_ip -eq 1 ];then
    peer_ip=$epg_ip_02
    peer_mac=$epg_addr_02
    send_warn="send_email"
  else
    peer_ip=$epg_ip_01
    peer_mac=$epg_addr_01
    send_warn="send_email_use_epg"
  fi

#master and slave node need to arping peer ip;
echo "[ INFO ] `date "+%Y/%m/%d %H:%M:%S"` target IP : ${peer_ip} correct Mac : ${peer_mac}" >> $log_check
arping -w 20 -c 10 -I eth0 ${peer_ip} | ( while read line
do
  if [ "${line:0:7}" == "Unicast" ];then
    grep_peer_mac=$(echo $line | grep -o ${peer_mac} | wc -l)
    if [ $grep_peer_mac -eq 0 ];then
      event_check=1
      error_mac=$(echo $line | grep -E -o "\[(.*)\]")
      echo "[ Error ] `date "+%Y/%m/%d %H:%M%S"` ${peer_ip} find conflict!!!! error mac: $error_mac " >> $log_check
      break
    else
      echo $line >> $log_check
    fi
  fi
done
if [ $event_check -eq 1 ];then
  event_string="<p><span style='color:#FF0000'>亚特兰蒂斯报警监控</span></p>"
  event_string="$event_string<hr/>"
  event_string="$event_string<p>报警内容: 出现IP地址冲突!</p>"
  event_string="$event_string<p>冲突IP:${peer_ip}</p>"
  event_string="$event_string<p>正确的Mac地址:${peer_mac}</p>"
  event_string="$event_string<p>检测到的Mac地址: $error_mac</p>"
  event_string="$event_string<hr/><p>请登录检查!</p>"
  eval "$send_warn \"$event_string\""
fi
)

check_vip=$( ip addr | grep $epg_vip | wc -l)
#use slave node to check all the other ip;
if [ $check_vip -ne 1 ];then
  #check vod_ip_01
  echo "[ INFO ] `date "+%Y/%m/%d %H:%M:%S"` target IP : ${vod_ip_01} correct Mac : ${vod_addr_01}" >> $log_check
  arping -w 20 -c 10 -I eth0 ${vod_ip_01} | ( while read line
  do
    if [ "${line:0:7}" == "Unicast" ];then
      grep_vod_01=$(echo $line | grep -o ${vod_addr_01} | wc -l)
      if [ $grep_vod_01 -eq 0 ];then
        event_check=1
        error_mac=$(echo $line | grep -E -o "\[(.*)\]")
        echo "[ Error ] `date "+%Y/%m/%d %H:%M%S"` ${vod_ip_01} find conflict!!!! error mac: $error_mac " >> $log_check
        break
      else
        echo $line >> $log_check
      fi
fi
done
if [ $event_check -eq 1 ];then
  event_string="<p><span style='color:#FF0000'>亚特兰蒂斯报警监控</span></p>"
  event_string="$event_string<hr/>"
  event_string="$event_string<p>报警内容: 出现IP地址冲突!</p>"
  event_string="$event_string<p>冲突IP:${vod_ip_01}</p>"
  event_string="$event_string<p>正确的Mac地址:${vod_addr_01}</p>"
  event_string="$event_string<p>检测到的Mac地址: $error_mac</p>"
  event_string="$event_string<hr/><p>请登录检查!</p>"
  eval "$send_warn \"$event_string\""
fi
)

#check vod_ip_02
echo "[ INFO ] `date "+%Y/%m/%d %H:%M:%S"` target IP : ${vod_ip_02} correct Mac : ${vod_addr_02}" >> $log_check
arping -w 20 -c 10 -I eth0 ${vod_ip_02} | ( while read line
do
  if [ "${line:0:7}" == "Unicast" ];then
    grep_vod_02=$(echo $line | grep -o ${vod_addr_02} | wc -l)
    if [ $grep_vod_02 -eq 0 ];then
      event_check=1
      error_mac=$(echo $line | grep -E -o "\[(.*)\]")
      echo "[ Error ] `date "+%Y/%m/%d %H:%M%S"` ${vod_ip_02} find conflict!!!! error mac: $error_mac " >> $log_check
      break
    else
      echo $line >> $log_check
    fi
  fi
done
if [ $event_check -eq 1 ];then
  event_string="<p><span style='color:#FF0000'>亚特兰蒂斯报警监控</span></p>"
  event_string="$event_string<hr/>"
  event_string="$event_string<p>报警内容: 出现IP地址冲突!</p>"
  event_string="$event_string<p>冲突IP:${vod_ip_02}</p>"
  event_string="$event_string<p>正确的Mac地址:${vod_addr_02}</p>"
  event_string="$event_string<p>检测到的Mac地址: $error_mac</p>"
  event_string="$event_string<hr/><p>请登录检查!</p>"
  eval "$send_warn \"$event_string\""
fi
)

#check epg_vip
echo "[ INFO ] `date "+%Y/%m/%d %H:%M:%S"` target IP : ${epg_vip} correct Mac : ${epg_addr_01} || ${epg_addr_02}" >> $log_check
arping -w 20 -c 10 -I eth0 ${epg_vip} | ( while read line
do
  if [ "${line:0:7}" == "Unicast" ];then
    grep_epg_master=$(echo $line | grep -o ${epg_addr_01} | wc -l)
    grep_epg_slave=$(echo $line | grep -o ${epg_addr_02} | wc -l)
    if [[ $grep_epg_master -eq 0 && $grep_epg_slave -eq 0 ]];then
      event_check=1
      error_mac=$(echo $line | grep -E -o "\[(.*)\]")
      echo "[ Error ] `date "+%Y/%m/%d %H:%M%S"` ${epg_vip} find conflict!!!! error mac: $error_mac " >> $log_check
      break
    else
      echo $line >> $log_check
    fi
  fi
done
if [ $event_check -eq 1 ];then
  event_string="<p><span style='color:#FF0000'>亚特兰蒂斯报警监控</span></p>"
  event_string="$event_string<hr/>"
  event_string="$event_string<p>报警内容: 出现IP地址冲突!</p>"
  event_string="$event_string<p>冲突IP:${epg_vip}</p>"
  event_string="$event_string<p>正确的Mac地址:${epg_addr_01} || ${epg_addr_02}</p>"
  event_string="$event_string<p>检测到的Mac地址: $error_mac</p>"
  event_string="$event_string<hr/><p>请登录检查!</p>"
  eval "$send_warn \"$event_string\""
fi
)

#check vod_vip
echo "[ INFO ] `date "+%Y/%m/%d %H:%M:%S"` target IP : ${vod_vip} correct Mac : ${vod_addr_01} || ${vod_addr_02}" >> $log_check
arping -w 20 -c 10 -I eth0 ${vod_vip} | ( while read line
do
if [ "${line:0:7}" == "Unicast" ];then
  grep_vod_master=$(echo $line | grep -o ${vod_addr_01} | wc -l)
  grep_vod_slave=$(echo $line | grep -o ${vod_addr_02} | wc -l)
  if [[ $grep_vod_master -eq 0 && $grep_vod_slave -eq 0 ]];then
    event_check=1
    error_mac=$(echo $line | grep -E -o "\[(.*)\]")
    echo "[ Error ] `date "+%Y/%m/%d %H:%M%S"` ${vod_vip} find conflict!!!! error mac: $error_mac " >> $log_check
    break
  else
    echo $line >> $log_check
  fi
fi
done
if [ $event_check -eq 1 ];then
  event_string="<p><span style='color:#FF0000'>亚特兰蒂斯报警监控</span></p>"
  event_string="$event_string<hr/>"
  event_string="$event_string<p>报警内容: 出现IP地址冲突!</p>"
  event_string="$event_string<p>冲突IP:${vod_vip}</p>"
  event_string="$event_string<p>正确的Mac地址:${vod_addr_01} || ${vod_addr_02}</p>"
  event_string="$event_string<p>检测到的Mac地址: $error_mac</p>"
  event_string="$event_string<hr/><p>请登录检查!</p>"
  eval "$send_warn \"$event_string\""
fi
)
fi
sleep 600
done

检测IP地址冲突的shell脚本-check_server_ip_conflict.sh的更多相关文章

  1. Linux下检测IP地址冲突及解决方法

    问题说明:在公司办公网内的一台物理机A上安装了linux系统(ip:192.168.9.120),在上面部署了jenkins,redmine,svn程序.由于是在办公网内,这台机器和同事电脑都是在同一 ...

  2. 【IP】Linux中检测IP地址冲突

    在Windows系统中,如果本地网络IP地址出现冲突,会出现图标提示. 在Linux系统中,并没有提供相关的功能,如果本地网络采用静态IP地址配置,出现比较奇怪的网络连接问题,如ssh连接复位,可以考 ...

  3. linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)

    本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...

  4. 【转载】Windows检测到IP地址冲突

    今天在使用电脑的过程中,突然弹出个提示,Windows检测到IP地址冲突,此网络中的另一台计算机与该计算机的IP地址相同.联系你的网络管理员解决此问题,有关详细信息,请参阅Windows系统日志.查阅 ...

  5. IP地址冲突

    IP地址冲突问题.. IP地址冲突多数是由于同一局域网内,有2台或者多台电脑设置了同一个本地IP地址,导致局域网内部IP冲突导致,,建议尽量将本地IP地址设置为自动获取--然后查看自动获取的IP地址是 ...

  6. 遇到电脑IP地址冲突了怎么解决

    由于路由器是自动分配IP地址的,如果多个设备设置的是IP地址自动获取,就会出现IP地址冲突的情况当局域网内有相同IP,并且该机器启动了防火墙,那就没办法自动更新到下一个IP的地址了,所以此时发生了冲突 ...

  7. 解决IP地址冲突

    1.重新启动路由器就可以. 要是网络上的每一个设备都被分配了动态IP地址,路由器重新启动.又一次分配IP地址给网络上的每一个设备后,这个问题就有望得到解决. 可是假设是在企业内就不可能随便的重新启动公 ...

  8. 正则表达式检测IP地址与端口号是否合法

    正则表达式检测IP地址与端口号是否合法,代码如下: 正则表达式检测IP地址 public static bool CheckAddress(string s) { bool isLegal = fal ...

  9. 【必看】局域网IP地址冲突罪魁祸首是谁?

    开源Linux 长按二维码加关注~ 上一篇:一文详解FTP.FTPS与SFTP的原理 现如今,人们的生活处处离不开网络.企业办公信息化对网络的依赖则更大.为了提升安全管理和信息化水平,很多企业不仅建设 ...

随机推荐

  1. oracle 常用字符串函数

    select  initcap('guodongdong') from dual;                                  /返回字符串并将字符串的第一个字母变为大写;  s ...

  2. Oracle 12c启动时PDBs的自动打开

    Pluggable Database(PDB)为Oracle 12c中的一个重要的新特性, 但启动12c实例时并不会自动打开PDB数据库,这样,在启动实例后必须手动打开PDBs. 1. 实例启动后,手 ...

  3. python中字典内置方法

  4. js 正则常用函数 会正则得永生

    正则表达式作为一种匹配处理字符串的利器在很多语言中都得到了广泛实现和应用,web开发本质上是处理字符串(服务端接受请求处理后拼接字符串作为响应,这在早期的CGI编程中最明显,然后客户端解析字符串进行渲 ...

  5. 【SQL】glob 和 like 的区别

    LIKE 和 GLOB 都可以用来匹配通配符指定模式的文本值.如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1 区别: (1)使用的通配符不一样 like:  百分号( ...

  6. 【oracle常见错误】ora-00119和ora-00132问题的解决方法

    oracle11g安装后,本地无法登录!前提:服务全部打开,监听也配置好了! win7 64位 oracle 11g 简单的sql命令: 先登录到sqlplus:sqlplus/nolog; 登录数据 ...

  7. SqlServer2008备份与还原(完整图示版)

    一.备份 1.在需要备份的数据库上,右键——任务——备份,如下: 2.选择备份到哪个路径和备份名字: 点击“添加”,如下, 3.上面点击“确定”后,回到第一个页面,选中刚才添加的路径和文件名 4.左上 ...

  8. (C/C++学习笔记) 二. 数据类型

    二. 数据类型 ● 数据类型和sizeof关键字(也是一个操作符) ※ 在现代半导体存储器中, 例如在随机存取存储器或闪存中, 位(bit)的两个值可以由存储电容器的两个层级的电荷表示(In mode ...

  9. BootstrapValidator验证

    相关链接: https://www.cnblogs.com/wuwenshuai/p/7120755.html https://www.cnblogs.com/v-weiwang/p/4834672. ...

  10. Problem A 还会用继承吗?

    定义一个Base类,包括1个int类型的属性,以及满足输出格式要求的构造函数.拷贝构造函数和析构函数. 定义Base类的子类Derived,包括1个int类型的属性, 以及满足输出格式要求的构造函数. ...