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