Shell脚本实现检测某ip网络畅通情况,实战用例

环境准备,linux shell 发送email 邮件:
1.安装sendmail
yum -y install sendmail
安装好sendmail以后执行以下命令启动sendmail
/etc/init.d/sendmail start
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
启动以后我们可以执行mail命令测试一下是否能发送邮件
一、通过文件内容发送邮件
mail -s 'Test mail' xxx@xxx.com < /etc/passwd

2.使用管道符发送邮件内容,安装mailx
yum install mailx -y

3.安装mutt
yum install mutt
echo -e "服务器异常,请检查" | mutt -s "xxx告警" xxx@xxx.com

邮件一般会被当成垃圾邮件,需要到垃圾箱里面查看,设置为不是垃圾邮件,或者添加白名单(由于不是正常邮箱格式,QQ邮箱添加不了白名单)

------------------------------
sendmail: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
Error sending message, child exited 127 (Exec error.).
Could not send the message.

============================================

 #!/bin/bash
####################################################################################
#本脚本放于异机,使用定时任务检测192.168.1.12是否网络畅通,如果不通则发邮件告警
#为防止频繁收到邮件,对发送邮件做了如下限制:
#一小时内只发前三条告警邮件,也就是如果网络一直不通,则每小时内只发前三条邮件。
#本脚本只能检测一个ip是否网络断开,可在开始部分加个循环,检测多个ip
####################################################################################
#初始化环境变量
source /root/.bash_profile
#邮件发送列表
mail_list='135xxxxxxxx@xx.com,xxx@xxx.com'
#ping三次检测的ip
ping=`ping -c 192.168.1.12|awk 'NR==7 {print $4}'`
#如果三次均没ping通,则做以下操作,ping不通可能返回为空,单个[]会报错-eq: unary operator expected,要用双重的 [ ]
if [[ $ping -eq ]]
then
#检查mailinfo文件是否存在,不存在则建立
if [ ! -e ./mailinfo ]
then
touch ./mailinfo
fi
#获取当前主机时间,用于邮件正文的时间显示
now_time=`date`
#检查./mailinfo的行数是否为空,如果为空则直接发送邮件
row_num=`wc -l ./mailinfo | cut -c `
if [ $row_num -eq ]
then
echo "发邮件"
echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list
#更新最后一次发送时间
date +%Y%m%d-%H%M > ./mailinfo
echo >> ./mailinfo
#如果mailinfo内容不为空,则判断(当前时间减1小时)是否大于上次发送时间,如果是则发邮件
else
#获取上次发邮件的日期和时间
last_date=`head - ./mailinfo | cut -c -`
last_time=`head - ./mailinfo | cut -c -`
#获取1小时前的日期和时间
current_date=`date +%Y%m%d`
current_time=`date +%H%M`
#计算当前时间和上次时间差距多久,加10#是为了防止0开头的字符被当成8进制计算
let time_diff=#$current_time-#$last_time
#获取发送次数
send_times=`tail - ./mailinfo`
#以下四种情况发邮件:
#当前日期>上次日期,可以发,然后发送计数send_times置为1
if [ "$current_date" -gt "$last_date" ]
then
echo "发邮件"
echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list
#更新最后一次发送时间
date +%Y%m%d-%H%M > ./mailinfo
echo >> ./mailinfo
fi
#当前日期等于上次日期 and 本次时间大于上次时间1小时外,可以发,然后发送计数send_times置为1
if [ "$current_date" -eq "$last_date" -a $time_diff -ge ]
then
echo "发邮件"
echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list
#更新最后一次发送时间
date +%Y%m%d-%H%M > ./mailinfo
echo >> ./mailinfo
fi
#当前日期等于上次日期 and 发送计数send_times置为1,可以发,然后发送次数加1
if [ "$current_date" -eq "$last_date" -a $send_times -eq ]
then
echo "发邮件"
echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list
#更新最后一次发送时间
date +%Y%m%d-%H%M > ./mailinfo
echo >> ./mailinfo
fi
#当前日期等于上次日期 and 发送计数send_times置为2,可以发,然后发送次数加1
if [ "$current_date" -eq "$last_date" -a $send_times -eq ]
then
echo "发邮件"
echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list
#更新最后一次发送时间
date +%Y%m%d-%H%M > ./mailinfo
echo >> ./mailinfo
fi
fi
fi

===============================
cd /home
mkdir shell
cd /home/shell/
复制上面内容到服务器上创建文件粘帖(window下保存的文件有编码问题)
vim checkserver.sh
从服务器编辑后sz下载的修改后可以直接上传,复制粘帖反而会成为一行,没有换行了。

-------------------------
增加执行权限
chmod +x checkserver.sh
-------------------------
测试脚本执行情况,可以先在文件头部加个echo信息,或者把IP改成ping不通的
./checkserver.sh
-------------------------
用crontab每5分钟执行一次
crontab -e
*/5 * * * * /home/shell/checkserver.sh

"/tmp/crontab.QIbyUa" 1L, 39C written
crontab: installing new crontab

Shell脚本实现检测某ip网络畅通情况,实战用例的更多相关文章

  1. shell脚本之颜色效果显示以及PS1颜色实战

    在bash shell脚本中我们可以使用ASCII颜色来显示文本信息. 格式:\033\[31m hello \033[0m ##m: 左侧#:这个#可以是3或者4,作用不一样. 3:前景色 4:背景 ...

  2. Linux Shell脚本之自动修改IP

    作为一名Linux SA,日常运维中很多地方都会用到脚本,而服务器的ip一般采用静态ip或者MAC绑定,当然后者比较操作起来相对繁琐,而前者我们可以设置主机名.ip信息.网关等配置.修改成特定的主机名 ...

  3. 制作service服务,shell脚本小例子(来自网络)

    事先准备工作:源码安装apache .安装目录为/usr/local/httpd 任务需求:1.可通过 service httpd start|stop|status|restart 命令对服务进行控 ...

  4. Shell脚本实现自动修改IP地址

    作为一名Linux SA,日常运维中很多地方都会用到脚本,而服务器的ip一般采用静态ip或者MAC绑定,当然后者比较操作起来相对繁琐,而前者我们可以设置主机名.ip信息.网关等配置.修改成特定的主机名 ...

  5. 使用shell脚本实现ping对应IP所对应的人名

    #!/bin/bash a=(张三 李四 王五 赵六) ..} do . $((${i}+)) >dev/>&;then ))"号"${a[${i}]}&quo ...

  6. shell脚本批量ping测试IP是否通

    #!/bin/bash rm -f result.txt cat ip.txt | fping > result.txt 2行代码就搞定,很方便,初学shell,很强大,问了下同事,但是shel ...

  7. 【shell脚本】检测当前用户是否为超级管理员===checkRoot.sh

    检测当前用户是否为超级管理员,是则使用yum安装vsftpd,不是则输出提示信息 脚本赋予执行权限 [root@VM_0_10_centos shellScript]# chmod a+x check ...

  8. shell脚本监控阿里云专线网络状态,若不通通过触发阿里云的进程监控报警

    #!/bin/bash while [ 1 ] do rtt=`ping -c 3 15.0.160.18 |grep rtt |awk '{print $4}' |awk -F'/' '{print ...

  9. shell脚本查找tcp过多ip地址封掉

    #!/bin/bash #hc source /etc/profile iplist=`netstat -ntu | awk '{print $5}'| cut -d':' -f1| sort |un ...

随机推荐

  1. 关于python的【if __name__ == "__main__":】

    学习东西真的需要自己动手,然后遇到问题,自己学着去解决.当然如果能得到高人指点,那真是走了八辈子运了.可以节省很多时间.但是大多数情况下,不能总是有高人来指点我们.这时就需要靠我们自己了. 在学习py ...

  2. Java clone克隆方法 --深拷贝--浅拷贝 --原型模型

    什么是深拷贝? 什么是浅拷贝? 创建一个对象的方法有几种? 默认的Object方法中的clone是深拷贝还是浅拷贝? 为什么说很多深拷贝都是不彻底的深拷贝? 什么是原型模型,什么是原型模式? 原型模型 ...

  3. Centos 添加永久路由

    今天在用虚拟机测试的时候,突然发现外网不通了,记得之前加过路由的,重启网络服务后就没了,仔细一想,应该是添加的路由是临时的,一重启就没了,于是乎就有了想把它永久写入的冲动,在看了一些文档之后,只要在/ ...

  4. 执行环境可以在SQLPLUS.EXE或者DOS(命令行)中执行

    Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命 令可以把dmp文件从本地导入到远处的数据库服务器中. ...

  5. java中String与StringBuilder的区别

    相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE ...

  6. ELK之nginx日志使用json格式输出

    json Nginx默认日志输出格式为文本非json格式,修改配置文件即可输出json格式便于收集以及绘图 修改nginx配置文件添加配置,增加一个json输出格式的日志格式 log_format a ...

  7. POJ-1975 Median Weight Bead(Floyed)

    Median Weight Bead Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3162 Accepted: 1630 De ...

  8. SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改)

    SQL Fundamentals || Oracle SQL语言 1.表的基本操作 (CREATE TABLE, DROP TABLE,TRUNCATE TABLE, RENAME tablename ...

  9. Pandas新建一个DataFrame

    我们在使用Pandas时候,前提需要一个新的DataFrame,需要首先初始化一个: 那么可以根据字典形式初始化: # 新建一个dataFrame df = pd.DataFrame({']) 必须包 ...

  10. CodeForces - 665D Simple Subset 想法题

    //题意:给你n个数(可能有重复),问你最多可以取出多少个数使得任意两个数之和为质数.//题解:以为是个C(2,n)复杂度,结果手摸几组,发现从奇偶性考虑,只有两种情况:有1,可以取出所有的1,并可以 ...