获取发布日志并通知 想想都是泪,我竟然加班到现在 = =,明天就是国庆!!! 我下班的时候领导是这么说的(上面还有个钉钉电话 = =),非得要我搞出来,逻辑有点问题,算是搞好了 话说这个需求源于周二的一个会议:业主方说对于xxx网,你们不能只是想到外部攻击,还要想想可能是内部人员没管理好,导致发了些不良的文章到线上。于是就有了这个需求:从一个叫 jeecms 的发布操作日志拿到最新信息,发到钉钉群。
我发现这个内容是可以从数据库里查出来的。
所以目的就是,有新增日志信息才发,发过的信息不要重复发(今天不讲过多细节,只贴代码)
首先这个 ID 是唯一的,所以重复信息我们可以根据这个 ID 去判断
sql查询要做表关联,因为日志表只有这个登录用户的 ID,账号名是没有的
注意 shell 传参如果有空格会被截断,所以里面有空格过滤。。。其他明天之后再说
#!/bin/bash Dir='/home/xxx/xxx-content' log_path=`date +"%Y%m"` d=`date +"%d"` ymd=`date +"%Y-%m-%d"` Ymd_Dir=${Dir}/${log_path}/${d} ## 每天一个年月日表 [ ! -d ${Ymd_Dir} ] && mkdir -p ${Ymd_Dir} ID_SNew=${Ymd_Dir}/logid_new_src ID_New=${Ymd_Dir}/logid_new ID_Old=${Ymd_Dir}/logid_old #ID文件,不存在则创建 [ ! -f ${ID_Old} ] && touch ${ID_Old} #内容文件 Ct_SNew=${Ymd_Dir}/content_src Ct_New=${Ymd_Dir}/content_new cd ${Ymd_Dir} ## 当天0点 begin_time=`date +"%Y-%m-%d 00:00:00"` ## 当前检测时间 end_time=`date +"%Y-%m-%d %H:%M:%S"` ## ljy的测试群 token1='钉钉token' ## 公司群 token2='钉钉token' # 发钉钉群 function SendMessageToDingdingljy(){ Dingding_Url=https://oapi.dingtalk.com/robot/send?access_token=$1 d_t=`date "+%F"_"%T"` #d_t=`date +"%T"` User=$2 Time=$3 Title=$4 Content=$5 #发送钉钉消息 curl -H "Content-Type: application/json" -X POST --data ' { "msgtype": "text", "text": { "content": "------ xxx网 ------ \r检测时间:'${d_t}' \r登录用户:'${User}' \r用户操作时间:'${Time}' \r标题:'${Title}' '${Content}' "}, "at": { "atMobiles": [ "我的手机号码" ], "isAtAll": false } }' ${Dingding_Url} > /dev/null 2>&1 } ## 1、查 日志id(唯一):今天0点~当前检测而时间 mysql -u{数据库登录用户} -p'{数据库登录密码}' -h{数据库登录地址} -e "use {数据库名}; select {日志ID} from {日志表} where {时间字段} >= '$begin_time' AND {时间字段} <= '$end_time' order by {时间字段} desc;" > ${ID_SNew} #去掉首行无用行,只要查出来的id cat ${ID_SNew} |grep -v "log_id" > ${ID_New} ## 2、检查是否有新增:log_id diff ${ID_New} ${ID_Old} status=`echo $?` >${Ct_SNew} ## 3、如果有新增:log_id,表示后台日志有新内容 if [ ${status} -ne 0 ] then ## ID_New 内容肯定要比 ID_Old内容多 diff ${ID_New} ${ID_Old} > dif # 找到log_id对应的文件行号,去掉第一行无用行 sed -n '/</=' dif > dif_num cat dif_num | while read line do #根据行号,找到 log_id 的日志内容 Dif_ID=`sed -n "$line"p dif |awk '{print $2}'` echo "Dif_ID: $Dif_ID" #3.1 根据 log_id,查新增内容 mysql -u{数据库登录用户} -p'{数据库登录密码}' -h{数据库登录地址} -e "use {数据库名}; SELECT users.username, log.log_time, log.ip, log.title, log.content from {日志表} log, {用户表} users where log.user_id=users.user_id and log_id='$Dif_ID' and log_time >= '$begin_time' AND log_time <= '$end_time';" >> ${Ct_SNew} done #3.2 去掉无用行 cat ${Ct_SNew} |grep -v "content" > ${Ct_New} #3.3 查新增内容 cat ${Ct_New} |while read line do user=`echo $line | awk '{print $1}'` time=`echo $line | awk '{print $3}'` title=`echo $line | awk '{print $5}'` if [ "$title" == "修改用户" ]; then content=`echo $line | awk -F'username=' '{print $2}'` else content=`echo $line | awk -F'title=' '{print $2}'` fi #3.3.1 如果日志内容为空,表示登录 # 登录失败会显示密码,也要过滤掉 if [ ! -n "$content" ] || [ "$title" == "登录失败" ]; then content1="" elif [ "$title" == "修改用户" ]; then content1=`echo $content` else content1="《$content》" fi #去除标题内容里面的空格 content2=`echo ${content1// /}` echo "content2= $content2" #content2=`echo ${content1} |sed 's/ /,/g'` #3.3.2 钉钉通知 SendMessageToDingdingljy ${token1} ${user} ${time} ${title} ${content2} SendMessageToDingdingljy ${token2} ${user} ${time} ${title} ${content2} done #3.4 替换最新log_id文件,防止重复发钉钉 cp ${ID_New} ${ID_Old} fi
效果图:
心累,明天再说说细节
标签:log,通知,ID,content,获取,日志,id,Dir From: https://www.cnblogs.com/windysai/p/16746445.html