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
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3