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
相关推荐
Rabitebla15 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
Decay__15 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
java_logo15 小时前
Docker 部署 Liquibase:轻松搭建数据库变更管理
数据库·docker·容器·数据库管理·liquibase·轩辕镜像·数据库变更
凤凰院凶涛QAQ16 小时前
《MySQL内核拆解:从SQL到InnoDB》(四) : 联合查询 & 视图
数据库·sql·mysql
码农小河6616 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
张小姐的猫17 小时前
【MySQL】访问 & 数据流动原理
android·数据库·mysql·adb·1024程序员节
Android系统攻城狮20 小时前
Linux FFmpeg深度解析之avcodec_default_get_encode_buffer调用流程与实战(二十八)
linux·运维·服务器·ffmpeg·车载音视频·ffmpeg音视频
程序员初一20 小时前
8080 打不开的四层定位:监听地址、ufw、DOCKER 链、安全组
linux·ssh
程序开发阿元20 小时前
swappiness 60 和 10 差在哪:一台 1C1G 的三轮对比
linux·ssh