基於Ping和Telnet/NC的監控腳本案例分析


 

通過shell腳本,判斷172.16.60.0/24網絡里,當前在線的ip有哪些?能ping通則認為在線。

[root@python2 ~]# cat /tmp/ip.sh
#!/bin/bash

for i in $(seq 1 254)                  #這一行或者換成"for i in {1..254}"
do
  IP=172.16.60.${i}
  ping -c2 ${IP} >/dev/null 2>&1
  if [ $? = 0 ];then 
    echo "${IP} is online!"
  else 
    echo "${IP} is failed"
  fi
done

執行腳本:
[root@python2 ~]# sh /tmp/ip.sh
172.16.60.1 is online!
172.16.60.2 is failed
172.16.60.3 is failed
172.16.60.4 is failed
......

案例一:單純地對某些ip進行ping監控

[root@test opt]# cat /opt/hosts_ip_list 
192.168.10.10 
192.168.10.11
192.168.10.12
192.168.10.13
192.168.10.14
192.168.10.15
192.168.10.16
192.168.10.17

[root@test opt]# cat /opt/hosts_ip_monit.sh
#!/bin/bash
for ip in $(cat /opt/hosts_ip_list)   
  do
     ping -c 1 $ip &>/dev/null                      #ping 3次,當3次ping都失敗時,則判定此ip網絡通信失敗。
     a=$?
     sleep 2
     ping -c 1 $ip &>/dev/null
     b=$?
     sleep 2
     ping -c 1 $ip &>/dev/null
     c=$?
     sleep 2
     DATE=$(date +%F" "%H:%M)
     if [ $a -ne 0 -a $b -ne 0 -a $c -ne 0 ];then
         echo -e "Date : $DATE\nHost : $ip\nProblem : Ping is failed."
         /bin/sed -i 's/^'$ip'/'#$ip'/g' /etc/hosts
     else
         echo "$ip ping is successful."
        /bin/sed -i 's/^'#$ip'/'$ip'/g' /etc/hosts
     fi
done

[root@test opt]# chmod 755 /opt/hosts_ip_monit.sh 

[root@test opt]# sh /opt/hosts_ip_monit.sh 
Date : 2018-04-24 15:49
Host : 192.168.10.10
Problem : Ping is failed.
Date : 2018-04-24 15:50
Host : 192.168.10.11
Problem : Ping is failed.
192.168.10.12 ping is successful.
192.168.10.13 ping is successful.
192.168.10.14 ping is successful.
192.168.10.15 ping is successful.
192.168.10.16 ping is successful.
Date : 2018-04-24 15:51
Host : 192.168.10.17
Problem : Ping is failed.

案例二:對/etc/hosts列表里的ip映射關系進行ping監控報警

測試系統服務器需要訪問域名www.test.com,該域名解析的DNS地址有很多個,需要在測試系統服務器上的做host綁定。在/etc/hosts文件了做了www.test.com域名的很多綁定,
在域名解析時,會從host綁定配置里從上到下匹配,如果上面綁定的ip不通,則域名解析就會失敗,不會主動去解析到下一個綁定的地址,除非將這個不通的ip綁定注釋掉或刪除掉。

現在要求:
當/etc/hosts文件里綁定的ip出現故障,ping不通的時候,將該ip的綁定自動注釋,並發出郵件報警;如果該ip恢復了正常通信,將自動打開該ip的綁定設置。
 
[root@cx-app01 ~]# cat /etc/hosts
#192.168.10.10 www.test.com
#192.168.10.11 www.test.com
192.168.10.12 www.test.com
192.168.10.13 www.test.com
192.168.10.14 www.test.com
192.168.10.15 www.test.com
192.168.10.16 www.test.com
#192.168.10.17 www.test.com
 
[root@cx-app01 ~]# ping www.test.com
PING www.test.com (192.168.10.12) 56(84) bytes of data.
64 bytes from www.test.com (192.168.10.12): icmp_seq=1 ttl=50 time=31.1 ms
64 bytes from www.test.com (192.168.10.12): icmp_seq=2 ttl=50 time=30.7 ms
64 bytes from www.test.com (192.168.10.12): icmp_seq=3 ttl=50 time=30.8 ms
.......
 
[root@cx-app01 ~]# cat /opt/hosts_ip_list
192.168.10.10
192.168.10.11
192.168.10.12
192.168.10.13
192.168.10.14
192.168.10.15
192.168.10.16
192.168.10.17
 
[root@cx-app01 ~]# cat /opt/hosts_ip_monit.sh
#!/bin/bash
for ip in $(cat /opt/hosts_ip_list)  
  do
     ping -c 1 $ip &>/dev/null         
     a=$?
     sleep 2
     ping -c 1 $ip &>/dev/null
     b=$?
     sleep 2
     ping -c 1 $ip &>/dev/null
     c=$?
     sleep 2
     DATE=$(date +%F" "%H:%M)
     if [ $a -ne 0 -a $b -ne 0 -a $c -ne 0 ];then
         echo -e "Date : $DATE\nHost : $ip\nProblem : Ping is failed."
         cat /etc/hosts|grep "^#$ip"
         d=$?
           if [ $d -ne 0 ];then
              /bin/bash /opt/sendemail.sh zhangsan@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip連接失敗,現已在/etc/hosts文件里注釋掉該ip的映射關系"
              /bin/bash /opt/sendemail.sh lisi@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip連接失敗,現已在/etc/hosts文件里注釋掉該ip的映射關系"
              /bin/bash /opt/sendemail.sh liuwu@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip連接失敗,現已在/etc/hosts文件里注釋掉該ip的映射關系"
              /bin/sed -i 's/^'$ip'/'#$ip'/g' /etc/hosts
           else
              echo "$ip is not conneted,and it has been done"
           fi
     else
         echo "$ip ping is successful."
         cat /etc/hosts|grep "^#$ip"
         f=$?
           if [ $f -eq 0 ];then
              /bin/bash /opt/sendemail.sh zhangsan@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip連接成功,現已在/etc/hosts文件里恢復該ip的映射關系"
              /bin/bash /opt/sendemail.sh lisi@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip連接成功,現已在/etc/hosts文件里恢復該ip的映射關系"
              /bin/bash /opt/sendemail.sh liuwu@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip連接成功,現已在/etc/hosts文件里恢復該ip的映射關系"
              /bin/sed -i 's/^'#$ip'/'$ip'/g' /etc/hosts
           else
              echo "$ip connection has been restored"
           fi
     fi
done
 
 
采用sendemail進行郵件告警發送,sendemail部署參考:http://www.cnblogs.com/kevingrace/p/5961861.html
[root@cx-app01 ~]# cat /opt/sendemail.sh
#!/bin/bash
# Filename: SendEmail.sh
# Notes: 使用sendEmail
#
# 腳本的日志文件
LOGFILE="/tmp/Email.log"
:>"$LOGFILE"
exec 1>"$LOGFILE"
exec 2>&1
SMTP_server='smtp.test.com'
username='monit@test.com'
password='monit@123'
from_email_address='monit@test.com'
to_email_address="$1"
message_subject_utf8="$2"
message_body_utf8="$3"
# 轉換郵件標題為GB2312,解決郵件標題含有中文,收到郵件顯示亂碼的問題。
message_subject_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_subject_utf8
EOF`
[ $? -eq 0 ] && message_subject="$message_subject_gb2312" || message_subject="$message_subject_utf8"
# 轉換郵件內容為GB2312,解決收到郵件內容亂碼
message_body_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_body_utf8
EOF`
[ $? -eq 0 ] && message_body="$message_body_gb2312" || message_body="$message_body_utf8"
# 發送郵件
sendEmail='/usr/local/bin/sendEmail'
set -x
$sendEmail -s "$SMTP_server" -xu "$username" -xp "$password" -f "$from_email_address" -t "$to_email_address" -u "$message_subject" -m "$message_body" -o message-content-type=text -o message-charset=gb2312
 
 
每10分鍾定時執行該監控腳本
[root@cx-app01 ~]# crontab -l
*/10 * * * *  /bin/bash -x /opt/hosts_ip_monit.sh > /dev/null 2>&1

案例三:通過nc工具對/etc/hosts列表里的ip的443端口跟本機通信是否正常進行探測

案例二是針對ping編寫的監控腳本,下面介紹下利用nc探測端口通信是否正常的腳本:

探測本機對下面/etc/hosts文件里的ip地址的443端口通信是否正常,如果通信失敗,則發出報警,並在/etc/hosts文件里注釋掉該ip地址的綁定關系。
如果注釋掉的ip的443端口跟本機恢復了通信,則去掉/etc/hosts文件里該ip的注釋!

[root@cx-app01 ~]# cat /etc/hosts
192.168.10.201 www.test.com
192.168.10.205  www.test.com
192.168.10.17  www.test.com
192.168.10.85  www.test.com
192.168.10.176   www.test.com
192.168.10.245  www.test.com
192.168.10.25    www.test.com
192.168.10.47  www.test.com

[root@cx-app01 ~]# cat /opt/hosts_ip_list 
192.168.10.201
192.168.10.205
192.168.10.17
192.168.10.85
192.168.10.176
192.168.10.245
192.168.10.25
192.168.10.47

采用nc工具去探測端口是否正常通信(yum install -y nc)
[root@cx-app01 ~]# /usr/bin/nc -z  -w 10 192.168.10.201 443
Connection to 192.168.10.201 443 port [tcp/https] succeeded!

針對上面ip列表里的地址,進行批量ip的443端口通信的探測。腳本如下:
[root@cx-app01 ~]# cat /opt/host_ip_nc_monit.sh 
#!/bin/bash
for ip in $(cat /opt/hosts_ip_list)  
do
    echo -e "Date : $DATE\nHost : $ip\nProblem : Port 443 is connected."
    cat /etc/hosts|grep "^#$ip" 
    a=$?
    if [ $a -ne 0 ];then
       /usr/bin/nc -z  -w 10 $ip 443
       b=$?
       if [ $b -ne 0 ];then
          /bin/bash /opt/sendemail.sh wangshibo@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip的443端口連接失敗,現已在/etc/hosts文件里注釋掉該ip的映射關系"
          /bin/bash /opt/sendemail.sh linan@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip的443端口連接失敗,現已在/etc/hosts文件里注釋掉該ip的映射關系"
          /bin/sed -i 's/^'$ip'/'#$ip'/g' /etc/hosts
       else
       echo "$HOSTNAME跟$ip的443端口正常連接"
       fi
    else
       /usr/bin/nc -z  -w 10 $ip 443
       c=$?
       if [ $c -eq 0 ];then
         /bin/bash /opt/sendemail.sh wangshibo@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip的443端口連接成功,現已在/etc/hosts文件里恢復該ip的映射關系"
         /bin/bash /opt/sendemail.sh linan@test.com "測試系統跟www.test.com通信情況" "$HOSTNAME跟$ip的443端口連接成功,現已在/etc/hosts文件里恢復該ip的映射關系"
         /bin/sed -i 's/^'#$ip'/'$ip'/g' /etc/hosts
       else
         echo "$HOSTNAME跟$ip的443端口連接失敗"
       fi
    fi
done

給腳本賦權
[root@cx-app01 ~]# chmod 755 /opt/host_ip_nc_monit.sh

執行腳本:
[root@cx-app01 ~]# sh /opt/host_ip_nc_monit.sh
Date : 
Host : 192.168.10.201
Problem : Port 443 is connected.
Connection to 192.168.10.201 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.201的443端口正常連接
Date : 
Host : 192.168.10.205
Problem : Port 443 is connected.
Connection to 192.168.10.205 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.205的443端口正常連接
Date : 
Host : 192.168.10.17
Problem : Port 443 is connected.
Connection to 192.168.10.17 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.17的443端口正常連接
Date : 
Host : 192.168.10.85
Problem : Port 443 is connected.
Connection to 192.168.10.85 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.85的443端口正常連接
Date : 
Host : 192.168.10.176
Problem : Port 443 is connected.
Connection to 192.168.10.176 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.176的443端口正常連接
Date : 
Host : 192.168.10.245
Problem : Port 443 is connected.
Connection to 192.168.10.245 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.245的443端口正常連接
Date : 
Host : 192.168.10.25
Problem : Port 443 is connected.
Connection to 192.168.10.25 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.25的443端口正常連接
Date : 
Host : 192.168.10.47
Problem : Port 443 is connected.
Connection to 192.168.10.47 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.47的443端口正常連接

結合crontab進行計划任務
[root@cx-app01 ~]# crontab -l
*/10 * * * *  /bin/bash -x /opt/host_ip_nc_monit.sh > /dev/null 2>&1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM