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
相关推荐
似水এ᭄往昔9 小时前
【Linux系统编程】--进程概念
linux·运维·服务器
Omics Pro9 小时前
「自兹以往」动物肠道微生物组
数据库·人工智能·机器学习·语言模型·自然语言处理
Dxy12393102169 小时前
Linux 如何关闭关不掉的进程
linux·运维·chrome
zzz_23689 小时前
【Redis】分布式锁完整演进
数据库·redis·分布式
小徐敲java10 小时前
Linux读取串口实时数据
linux·运维·服务器
mN9B2uk1710 小时前
数据库的约束简介
java·数据库·sql
计算机安禾10 小时前
【数据库系统原理】第4篇:关系数据结构的形式化定义:域、笛卡尔积与关系模式
数据结构·数据库·算法
Henry-SAP10 小时前
SAP(ERP) BOM变更实时同步MRP方案
数据库·云原生
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题 第99题】【Mysql篇】第29题:如何选择合适的分布式主键方案?
java·数据库·分布式·mysql·面试
keyipatience10 小时前
25.Linux静态动态库全解析
linux·运维·服务器