linux系统-统计连接数-钉钉告警

一、脚本

复制代码
## vi tongji.sh
#!/bin/bash
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=c8811248e64dc396fb73axxxx"
SECRET="SECf3e9d08c42dfff13091xxxxxxxxxxx"

get_server_ip() {
  local ip=$(ip -4 addr show|grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep -v '^127\.' |head -1)
  echo "$ip"
}
send_dingtalk(){
  local message="$1"
  local timestamp=$(date +%s%3N)
  local request_url="$WEBHOOK_URL"
  if [ -n "$SECRET" ];then
    local string_to_sign="${timestamp}"$'\n'"${SECRET}"
    local sign=$(echo -n "$string_to_sign" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64)
#    local sign=$(echo -n "$string_to_sign" | openssl digest -sha256 -hmac "$SECRET" | base64)
    sign=$(echo -n "$sign" | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g')
    request_url="${WEBHOOK_URL}&timestamp=${timestamp}&sign=${sign}"
  fi
  local payload=$(cat <<-EOF
{
  "msgtype": "markdown",
  "markdown": {
    "title": "连接告警",
    "text": "${message}"
  },
  "at": {
    "isAtAll": false
  }
}
EOF
)
  curl -s -H "Content-Type: application/json" -d "$payload" "$request_url"
}

check_connections() {
  local threshold=500
  local server_ip=$(get_server_ip)
  local conn_count=$(netstat -tlan | wc -l)
  conn_count=$(echo "$conn_count" | tr -d ' ')
  if [ "$conn_count" -gt "$threshold" ]; then
    local alert_msg="#### 服务器连接数告警\n\n"
    alert_msg+="- **服务器IP**: \`${server_ip}\`\n"
    alert_msg+="- **当前连接数**: **${conn_count}**\n"
    alert_msg+="- **告警阈值**: ${threshold}\n"
    alert_msg+="- **出发时间**: `date '+%Y-%m-%d %H:%M:%S'`\n\n"
    local tcp_stats=$(netstat -tlan | awk 'NR>2 {print $6}' | sort | uniq -c | awk '{printf "- %s: %s\\n", $2, $1}')
    if [ -n "$tcp_stats" ]; then
      alert_msg+="**连接状态统计**: \n${tcp_stats}\n"
    fi
    alert_msg+="\n**TOP 5 连接IP**: \n"
    local top_ips=$(netstat -tlan | awk 'NR>2 {print $5}' | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | sort -rn | head -5 | awk '{printf "- %s (%s)\\n", $2, $1}')
    if [ -n "$top_ips" ]; then
      alert_msg+="$top_ips"
    else
      alert_msg+="- 无外部链接"
  fi
  send_dingtalk "$alert_msg"

  echo "[$(date '+%Y-%m-%d %H:%M:%S')] 告警出发 - IP: $server_ip, 连接数: $conn_count" >> /var/log/connection_alert.log
fi
}
check_connections

二、测试

sh -x tongji.sh

三、效果

四、任务计划

复制代码
crontab -e

*/30 * * * * /usr/bin/bash /opt/scripts/tongji.sh
相关推荐
mounter62516 小时前
【内核新动向】告别物理槽位束缚:深度解析 Linux Virtual Swap Space 机制
linux·内存管理·kernel·swap·virtual swap
handler0116 小时前
从零实现自动化构建:Linux Makefile 完全指南
linux·c++·笔记·学习·自动化
chenxu98b17 小时前
MySQL如何执行.sql 文件:详细教学指南
数据库·mysql
刘晨鑫117 小时前
MongoDB数据库应用
数据库·mongodb
2023自学中17 小时前
i.MX6ULL 板子的完整启动流程图(从上电 → 用户空间)
linux·嵌入式
闫利朋17 小时前
Ubuntu 24.04 桌面安装向日葵完整指南
linux·运维·ubuntu
梦想的颜色17 小时前
mongoTemplate + Java 增删改查基础介绍
数据结构·数据库·mysql
YSF2017_318 小时前
C语言16-makefile(3)——makefile的模式规则
linux·c语言·开发语言
小小小米粒18 小时前
redis命令集合
数据库·redis·缓存
herinspace18 小时前
管家婆实用贴-如何分离和附加数据库
开发语言·前端·javascript·数据库·语音识别