问题背景
在之前这个场景中 调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
监控/var/log/graylog-server/server.log文件,当触发了告警时/var/log/graylog-server/server.log中会出现[LoggingAlert] POST-BODY的日志
监控脚本会自动提取POST-BODY后的内容输出到/tmp/message.json,然后调send_dingtalk_robot函数自动发送告警到用户
当时是后台运行这个shell脚本
nohup ./monitor_alertjson_sendtodingdingrobot.sh > monitor_alertjson_sendtodingdingrobot.log 2>&1 &
但是发现这个shell脚本在后台运行一段时间后,会发现这个脚本在后台不再运行,异常退出了
排查过程
由于不太好排查,可能是/var/log/graylog-server/server.log发生了轮转,或者其他原因
(图片点击放大查看)
(图片点击放大查看)
为了避免这样的问题发生,借助chatgpt修改了脚本,再结合crontab,做了脚本优化
修改后的monitor_alertjson_sendtodingdingrobot.sh
#!/bin/bash
send_dingtalk_robot(){
Token=`curl -s -X POST 'https://api.dingtalk.com/v1.0/oauth2/accessToken' -H 'Content-Type: application/json' -d '{"appKey": "dingeXXXXX","appSecret": "XXXXXXXX"}' | jq -r .accessToken`
curl -s -X POST 'https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend' -H 'Content-Type: application/json' -H "x-acs-dingtalk-access-token:$Token" -d@/tmp/message.json
}
logfile="/var/log/graylog-server/server.log"
outputfile="/tmp/message.json"
keyword="POST-BODY"
# 检查标记文件是否存在
if [ -f "/tmp/file_monitor_running" ]; then
# 如果标记文件存在,则表示上一次监控还未完成,退出脚本
echo "Monitoring is already running. Exiting..."
exit 0
fi
# 创建标记文件
touch /tmp/file_monitor_running
# 实时监控日志文件
tail -n 0 -F "$logfile" | while read -r line; do
if [[ $line == *"$keyword"* ]]; then
# 提取关键字后面的内容
content=$(echo "$line" | awk -F"$keyword" '{print $2}')
# 存储到文件
echo "$content" > "$outputfile"
echo "------------------Alert Start--------------------------------------"
echo "已提取并保存内容到 $outputfile"
echo "告警产生时间如下"
echo `date "+%Y-%m-%d %H:%M:%S"`
echo "告警内容如下"
echo `cat $outputfile`
send_dingtalk_robot
echo "已发送钉钉机器人"
echo "------------------Alert Finished-----------------------------------"
fi
done
# 删除标记文件
rm -rf /tmp/file_monitor_running
结合crontab
crontab -e
*/5 * * * * /etc/graylog/server/monitor_alertjson_sendtodingdingrobot.sh >> /etc/graylog/server/monitor_alertjson_sendtodingdingrobot.log
(图片点击放大查看)
查看脚本后台运行状态
ps -faux
(图片点击放大查看)
Tips: 脚本中的appKey”: “dingeXXXXX”,”appSecret”: “XXXXXXXX”请自行替换
告警效果
(图片点击放大查看)
Tips:Linux文件创建时间的问题
在解决这个问题的过程想去确认 /var/log/graylog-server/server.log的文件的创建时间
但发现stat /var/log/graylog-server/server.log命令中无Birth信息
(图片点击放大查看)
这个问题引申出来Linux文件创建时间的问题
通过搜索相关知识,最终针对xfs ext4不同的文件系统,编写了一个shell脚本,来获取某个文件的创建时间. xfs ext4类型的文件系统均支持
vim get_file_creation_time.sh
脚本如下
#!/bin/bash
file="$1" # 文件名作为参数传递给脚本
# 获取文件所在文件系统类型
filesystem=$(df --output=fstype "$file" | tail -n 1)
if [ "$filesystem" == "xfs" ]; then
# XFS 文件系统
inode=$(ls -i "$file" | awk '{print $1}')
dfinfo=$(df --output=source "$file" | tail -n 1)
if [ -z "$inode" ]; then
echo "文件不存在或无法访问"
exit 1
fi
crtime=$(xfs_db -r -c "inode $inode" -c "p v3.crtime.sec" "$dfinfo")
if [ -z "$crtime" ]; then
echo "无法获取文件的创建时间"
else
echo "$file 文件的创建时间: $crtime"
fi
elif [ "$filesystem" == "ext4" ]; then
# ext4 文件系统
inode=$(ls -i "$file" | awk '{print $1}')
dfinfo=$(df --output=source "$file" | tail -n 1)
if [ -z "$inode" ]; then
echo "文件不存在或无法访问"
exit 1
fi
crtime=$(debugfs -R "stat <$inode>" "$dfinfo" 2>/dev/null | grep crtime | awk '{print $4,$5,$6, $7, $8}')
if [ -z "$crtime" ]; then
echo "无法获取文件的创建时间"
else
echo "$file 文件的创建时间: $crtime"
fi
else
echo "不支持的文件系统类型: $filesystem"
fi
脚本效果如下
-
xfs 文件系统下
(图片点击放大查看)
-
ext4文件系统下
(图片点击放大查看)
原文始发于微信公众号(WalkingCloud):【优化篇】调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/243432.html