Linux中使用Shell把报警信息发送至邮件和微信上

Linux中使用Shell把报警信息发送至邮件和微信上

创建企业微信报警

注册一个企业微信号

点击企业微信,进行企业注册。

注册成功后会看到企业信息页面,把企业ID先记录下来,后面发送报警脚本里需要配置。

创建一个部门,专供发送报警用,并添加需要接收报警的成员

点击“通讯录”,再点击+号,选择添加部门

把部门ID记录下来,后面配置web端用户报警媒介的收件人要用到。

给刚创建的部门添加成员,可以直接添加成员也可以微信邀请,可以先将管理员微信添加进来。

新增一个第三方应用

点击应用与小程序-创建应用

可见范围那里选择刚才添加的那个部门。

将AgentId和Secret记录下来,发送脚本里需要配置

邮箱设置

配置mail.rc

cat >>/etc/mail.rc<<EOF
set from=175xxxxx5@163.com # 设置发件人信息,注:如果使用163邮箱,发件人信息必须设置和实际邮箱号一致,不然无法发送。
set smtp=smtp.163.com # 设置邮件服务器
set smtp-auth-user=‘175xxxxx5‘ # 设置验证用户名
set smtp-auth-password=‘12345678‘  # 设置验证密码
set smtp-auth=login # 可忽略

报警脚本

我在这里只是举个实例,具体的监控报警事件,请以实际为准。

如:在生产环境下批量检测Web服务是否正常,最多检查三次,并且发送相关邮件或微信报警信息。

以用户的形式发送信息,Shell代码如下:

# cat web_server_user.sh

#!/bin/bash

#定义脚本存放路径
path=/tmp/scripts
#定义邮件列表,以空格隔开
MAIL_GROUP="175xxxxxx45@163.com"
#定义日志路径
LOG_FILE="/tmp/scripts/web_check.log"
###send message from weixin for monitoring###
CropID=‘wwxxxxxx061‘  # 企业ID(AgentId)
Secret=‘m-v-x6BxxxxxxxxxxxxXmQMfw‘
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F \" ‘{print $10}‘)
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
#创建目录
[ ! -d "$path" ] && mkdir -p $path
#定义URL列表函数
function UrlList(){
    cat >$path/domain.list<<EOF
    http://blog.51cto.com/wutengfei
    www.baidu.com
    www.datagrand.com
    http://blog.52cto.com/wutf
    http://192.168.246.171
EOF
}
#定义检查URL函数
function CheckUrl(){
    #初始化失败次数为0次
    FAILCOUNT=0
    #检查3次,定义for循环
    for ((i=1;i<=3;i++))
    do
        #定义具体的访问URL命令,不输出信息
        wget -T 5 --tries=1 --spider $1 >/dev/null 2>&1
        if [ $? -ne 0 ];then
            let FAILCOUNT+=1
        else
            ##返回值是0,则表示访问URL成功,跳出for循环,不做3次检测了
            break
        fi
    done
    ##将失败次数作为返回值,返回函数外的脚本中
    return $FAILCOUNT
}
#定义邮件函数
function Mail(){
    local SUBJECT_CONTENT=$1
    for MAIL_USER in $(echo $MAIL_GROUP)
    do
        #发送邮件
        mail -s "${SUBJECT_CONTENT}" ${MAIL_USER} < ${LOG_FILE}
    done
}
#定义微信函数
function WeiXin(){
    local int AppID=1000002           # 企业号中的应用id
    #local UserID="${cat $path/weixin_user.txt}"      # 部门成员id,企业微信中定义的微信接收者
    local UserID="@all"               # 企业微信APP中的全部报警用户
    #local PartyID=$2                 # 部门id,定义了范围,组内成员都可接收到消息
    local Msg=$(cat ${LOG_FILE})           # 过滤出企业微信中传递的第三个参数
    printf ‘{\n‘
   # printf ‘\t"touser": "‘$UserID‘",\n‘
    printf ‘\t"touser": "‘"$UserID"\","\n"
    #printf ‘\t"toparty": "$PartyID",\n‘
    printf ‘\t"msgtype": "text",\n‘
    printf ‘\t"agentid": "‘$AppID‘",\n‘
    printf ‘\t"text": {\n‘
    ##printf ‘\t\t"content": "‘$Msg‘"\n‘
    printf ‘\t\t"content": "‘"$Msg"\""\n"
    printf ‘\t},\n‘
    printf ‘\t"safe":"0"\n‘
    printf ‘}\n‘
}

#定义发送信息函数
function SendMsg(){
    if [ $1 -ge 3 ];then
        RETVAL=1
        NOW_TIME=$(date +"%Y-%m-%d %H:%M:%S")
        SUBJECT_CONTENE="$2 is error,${NOW_TIME}."
        echo -e ${SUBJECT_CONTENE}|tee ${LOG_FILE}
        #发送邮件报警
        Mail ${SUBJECT_CONTENE}
        #发送微信报警
        #for $weixin in $(cat $path/weixin_user.txt)
        #do
        curl --data-ascii "$(WeiXin)" $PURL
        printf ‘\n‘
        echo "over!"
       # done
    else
        echo "http://$2 is ok"
        RETVAL=0
    fi
    return $RETVAL
}

#定义主函数
function main(){
    UrlList
    for url in $(cat $path/domain.list)
    do
        CheckUrl $url
        SendMsg $? $url
    done
}
main

以用户组的形式发送信息,Shell代码如下:

cat web_server_group.sh

#!/bin/bash

#定义脚本存放路径
path=/tmp/scripts
#定义邮件列表,以空格隔开
MAIL_GROUP="175xxxxxx45@163.com"
#定义日志路径
LOG_FILE="/tmp/scripts/web_check.log"
###send message from weixin for monitoring###
CropID=‘wwxxxxxxxxx8061‘
Secret=‘m-v-xxxxxxxxxxxxxxxXmQMfw‘
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F \" ‘{print $10}‘)
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
#创建目录
[ ! -d "$path" ] && mkdir -p $path
#定义URL列表函数
function UrlList(){
    cat >$path/domain.list<<EOF
    http://blog.51cto.com/wutengfei
    www.baidu.com
    www.datagrand.com
    http://blog.52cto.com/wutf
    http://192.168.246.171
EOF
}
#定义检查URL函数
function CheckUrl(){
    #初始化失败次数为0次
    FAILCOUNT=0
    #检查3次,定义for循环
    for ((i=1;i<=3;i++))
    do
        #定义具体的访问URL命令,不输出信息
        wget -T 5 --tries=1 --spider $1 >/dev/null 2>&1
        if [ $? -ne 0 ];then
            let FAILCOUNT+=1
        else
            ##返回值是0,则表示访问URL成功,跳出for循环,不做3次检测了
            break
        fi
    done
    ##将失败次数作为返回值,返回函数外的脚本中
    return $FAILCOUNT
}
#定义邮件函数
function Mail(){
    local SUBJECT_CONTENT=$1
    for MAIL_USER in $(echo $MAIL_GROUP)
    do
        #发送邮件
        mail -s "${SUBJECT_CONTENT}" ${MAIL_USER} < ${LOG_FILE}
    done
}
#定义微信函数
function WeiXin(){
    local int AppID=1000002           # 企业号中的应用id
    #local UserID="${cat $path/weixin_user.txt}"      # 部门成员id,企业微信中定义的微信接收者
    #local UserID="@all"               # 企业微信APP中的全部报警用户
    local PartyID=4               # 部门id,定义了范围,组内成员都可接收到消息
    local Msg=$(cat ${LOG_FILE})           # 过滤出企业微信中传递的第三个参数
    printf ‘{\n‘
    printf ‘\t"touser": "‘"$UserID"\","\n"
    printf ‘\t"toparty": "‘"$PartyID"\","\n"
    printf ‘\t"msgtype": "text",\n‘
    printf ‘\t"agentid": "‘$AppID‘",\n‘
    printf ‘\t"text": {\n‘
    ##printf ‘\t\t"content": "‘$Msg‘"\n‘
    printf ‘\t\t"content": "‘"$Msg"\""\n"
    printf ‘\t},\n‘
    printf ‘\t"safe":"0"\n‘
    printf ‘}\n‘
}

#定义发送信息函数
function SendMsg(){
    if [ $1 -ge 3 ];then
        RETVAL=1
        NOW_TIME=$(date +"%Y-%m-%d %H:%M:%S")
        SUBJECT_CONTENE="$2 is error,${NOW_TIME}."
        echo -e ${SUBJECT_CONTENE}|tee ${LOG_FILE}
        #发送邮件报警
        Mail ${SUBJECT_CONTENE}
        #发送微信报警
        #for $weixin in $(cat $path/weixin_user.txt)
        #do
        curl --data-ascii "$(WeiXin)" $PURL
        printf ‘\n‘
        echo "over!"
       # done
    else
        echo "http://$2 is ok"
        RETVAL=0
    fi
    return $RETVAL
}

#定义主函数
function main(){
    UrlList
    for url in $(cat $path/domain.list)
    do
        CheckUrl $url
        SendMsg $? $url
    done
}
main

报警测试

微信报警截图

邮件报警截图

设置定时任务

# crontab -l
*/3 * * * * /bin/sh /tmp/web_server_group.sh &>/dev/null # 每隔三分钟检查一次

原文地址:http://blog.51cto.com/wutengfei/2315884

时间: 2024-10-11 12:49:49

Linux中使用Shell把报警信息发送至邮件和微信上的相关文章

Linux中的shell

shell的含义: 首先shell的英文含义是"壳": 它是相对于内核来说的,因为它是建议在核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核. Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息: shell在Linux中的存在形式: 由于Linux不同于Windows,Linux是内核与界面分离的,它可以脱离图形界面而单独运行,同样也可以在内核的基础上运行图形化的桌面. 这样,在Lin

Linux中执行shell脚本的4种方法

这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下. bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/root/bin目录中并已有执行权限(添加权限的方法:chmod +x hello.sh). 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: ./ 的意思是说在当前的工作目录下执行hello.sh.如果不加上

Linux中执行shell脚本

这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下 bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限.方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本:复制代码 代码如下: cd /data/shell./hello.sh ./的意思是说在当前的工作目录下执行hello.s

Linux中的shell到底是什么

(引自:https://zhidao.baidu.com/question/557066905.html) [一] shell的含义: 首先shell的英文含义是"壳": 它是相对于内核来说的,因为它是建立在内核的基础上,面向于用户的一种表现形式,比如我们看到一个球,见到的是它的壳,而非核. Linux中的shell,是指一个面向用户的命令接口,表现形式就是一个可以由用户录入的界面,这个界面也可以反馈运行信息: [二]shell在Linux中的存在形式: 由于Linux不同于Windo

Linux中bash shell入门

▲初探shell Shell分为图形界面shell(如win中的explorer,linux中的kDE和GNOME)和命令行shell.Shell是一个命令解释器,又分为交互式和非交互式.也可分为登陆式shell(需输入用户名和密码)和非登陆式shell Linux中支持的shell在/etc/shells文件中 Linux使用的默认shell为bash(Bourne Again Shell) ? type [-at] name????显示name是外部命令还是bash内置命令 ????参数-t

Linux中的shell脚本编程——数组 ,高级字符串操作 ,高级变量 ,配置用户环境

概述: 概述: 本章节将讲述Linux中shell脚本编程的数组,高级字符串处理,高级变量和配置用户的环境. 一.函数和位置参数扩展 1.shift 命令实现在位置参数中的跳跃,会把最左边的参数挤掉     2.匿名函数的使用 第一篇:数组 一.数组的定义: 1.变量:存储单个元素的内存空间 2.数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 3.数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开

linux中 bash shell terminal的解释

shell:是内核的一个外层保护工具,并负责完成用户与内核之间的交互: 提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行. 是一个命令行解释器,解释由用户输入的命令并把它们送入内核去执行. bash:Linux中shell种类很多,bash就是其中一种. terminal:终端用来启动shell环境  . 原文地址:http://blog.51cto.com/5468775/2090296

Linux 中 Fish Shell

每个 Linux 管理员都可能听到过 shell 这个词.你知道什么是 shell 吗? 你知道 shell 在 Linux 中的作用是什么吗? Linux 中有多少个 shell 可用? shell 是一个程序,它是提供用户和内核之间交互的接口. 内核是 Linux 操作系统的核心,它管理用户和操作系统之间的所有内容.Shell 可供所有用户在启动终端时使用.终端启动后,用户可以运行任何可用的命令.当 shell 完成命令的执行时,你将在终端窗口上获取输出. Bash(全称是 Bourne A

Linux中的shell脚本编程——基础篇

概述: shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础.脚本基本格式.变量.运算.条件测试这几个方面详细介绍shell脚本编程的基础内容,也是我们必须要掌握熟练的内容. 一.编程环境 1.程序:指令+数据 程序编程的风格有两种: 过程式:以指令为中心,数据服务与指令 对象式:以数据为中心,指令服务于数据 2.程序的执行方式: □计算机:只能识别二进制文件