#!/bin/bash # 验证长轮询能不能穿过 Cloudflare 隧道跑满 60 秒。 # # 为什么要先验: # Cloudflare 对单个 HTTP 请求有 **100 秒**上限,超了返回 524。 # 我们打算把长轮询从 15 秒拉到 60 秒 —— # 如果隧道/CF 那边撑不住,agent 会一直断线重连,反而更糟。 # 所以先拿真实的 poll 接口量一遍。 # # 做法: # 1. 注册一台临时设备,拿到 token # 2. 用 token 打 /v1/agent/poll(公网地址),量它挂了多久 # 3. 对比本机直连和中转两条路 set -u BASE=https://relay.xxmxxs.top LOCAL=http://127.0.0.1:8080 UA='LanRemote/1.8.0' echo "════════ 1. 注册一台临时设备 ════════" DEV="probe-$(date +%s)" REG=$(curl -s --max-time 30 -X POST "$BASE/v1/agent/register" \ -H 'Content-Type: application/json' \ -H "User-Agent: $UA" \ -d "{\"deviceId\":\"$DEV\",\"code\":\"999999\",\"name\":\"poll-probe\",\"version\":\"1.8.0\"}") echo " $REG" | head -c 200 echo TOKEN=$(echo "$REG" | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))" 2>/dev/null) if [ -z "$TOKEN" ]; then echo " [失败] 没拿到 token,后面的测试没法做" exit 1 fi echo " token 长度 ${#TOKEN}" echo echo "════════ 2. 本机直连 poll(基准,应等于服务端设定的秒数)════════" for i in 1 2; do out=$(curl -s -o /tmp/poll_local.bin -w '%{http_code} %{time_total}' \ --max-time 120 -X POST "$LOCAL/v1/agent/poll" \ -H "X-Token: $TOKEN" -H "User-Agent: $UA") size=$(wc -c < /tmp/poll_local.bin 2>/dev/null || echo 0) echo " 第 $i 次: 码/耗时 = $(echo "$out" | awk '{printf "%s %.1fs", $1, $2}') 返回 $size 字节" done echo echo "════════ 3. 走公网(Cloudflare 隧道)poll ════════" echo " 这是关键:能不能挂满 60 秒不断" ok=0 for i in 1 2 3; do out=$(curl -s -o /tmp/poll_pub.bin -w '%{http_code} %{time_total}' \ --max-time 130 -X POST "$BASE/v1/agent/poll" \ -H "X-Token: $TOKEN" -H "User-Agent: $UA") code=$(echo "$out" | awk '{print $1}') secs=$(echo "$out" | awk '{printf "%.1f", $2}') size=$(wc -c < /tmp/poll_pub.bin 2>/dev/null || echo 0) mark="" [ "$code" = "200" ] && mark="✓" [ "$code" = "524" ] && mark="**CF 超时了**" printf " 第 %d 次: 码 %s 耗时 %ss 返回 %s 字节 %s\n" "$i" "$code" "$secs" "$size" "$mark" [ "$code" = "200" ] && ok=$((ok + 1)) sleep 1 done echo " 成功 $ok/3" echo echo "════════ 4. 服务端当前的长轮询设定 ════════" grep -E '^REMOTE_POLL|Environment=RELAY_POLL' /etc/systemd/system/lanremote-relay.service 2>/dev/null | sed 's/^/ /' echo " 实际生效: $(curl -s --max-time 10 $LOCAL/v1/health | python3 -c 'import sys,json; d=json.load(sys.stdin); print("(health 没报这个字段)")' 2>/dev/null)" tail -40 /root/lanremote-relay/relay.log 2>/dev/null | grep '长轮询' | tail -1 | sed 's/^/ /' echo echo "════════ 5. 清掉临时设备 ════════" KEY=$(cat /root/lanremote-relay/data/admin_key.txt 2>/dev/null) curl -s --max-time 20 -X POST "$LOCAL/v1/admin/delete" \ -H "X-Admin: $KEY" -H 'Content-Type: application/json' \ -d "{\"deviceId\":\"$DEV\"}" | head -c 120 echo