Files
workbuddy_skills/dual-link-proxy/scripts/verify-links.sh
T
admin b2016af916 feat(dual-link-proxy): 一键安装脚本,空机器一条命令装完链路与面板
- 新增 scripts/install-dual-link.sh:装 3x-ui → 建两条 VLESS+WS 入站(绑 127.0.0.1)
  → 80 vhost 完成 ACME → 签证书 → 切 443 → 可选面板子域 + Basic Auth → 实测 101 并打印链接;
  支持 --dry-run 干跑、--yes 无人值守、已有 3x-ui 时复用而不重置密码
- 3xui-api.py 补 uuid / link / del-inbound 三个子命令,add 的 --uuid 改为可选
- verify-links.sh 统计实际检查项,空跑以退出码 2 报错,避免假通过
- 避坑清单补三条脚本类实测:ss 端口判定的字段误用、dry-run 仍落盘、验收空跑
2026-10-18 20:18:33 +08:00

96 lines
2.7 KiB
Bash

#!/usr/bin/env bash
# 双链路代理验收:链路 101、站点 200、面板 200(带浏览器 UA)
#
# 用法:
# ./verify-links.sh \
# --link <域名A>:/<路径> \
# --link <域名B>:/<路径> \
# --site <站点域名> \
# --panel https://<面板域名>/ --panel-auth user:secret
#
# 退出码:全部通过为 0,任一失败为 1
set -u
UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
WS_KEY="dGhlIHNhbXBsZSBub25jZQ=="
FAIL=0
CHECKS=0
check_link() {
CHECKS=$((CHECKS+1))
local spec="$1"
local host="${spec%%:*}"
local path="${spec#*:}"
local out
out=$(curl -s -i --http1.1 \
-H "Upgrade: websocket" -H "Connection: Upgrade" \
-H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: $WS_KEY" \
--max-time 20 "https://${host}${path}" 2>/dev/null | grep -oE "HTTP/1.1 (101|4[0-9][0-9]|5[0-9][0-9])" | head -1)
if echo "$out" | grep -q "101"; then
echo " PASS link ${host}${path} ${out}"
else
echo " FAIL link ${host}${path} 期望 101,实际 ${out:-无响应}"
FAIL=1
fi
}
check_site() {
CHECKS=$((CHECKS+1))
local host="$1"
local code
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 20 "https://${host}/" 2>/dev/null)
if [ "$code" = "200" ]; then
echo " PASS site ${host} ${code}"
else
echo " FAIL site ${host} 期望 200,实际 ${code:-无响应}"
FAIL=1
fi
}
check_panel() {
CHECKS=$((CHECKS+1))
local url="$1"
local auth="$2"
local code
if [ -n "$auth" ]; then
code=$(curl -s -L -o /dev/null -w "%{http_code}" -u "$auth" -A "$UA" --max-time 25 "$url" 2>/dev/null)
else
code=$(curl -s -L -o /dev/null -w "%{http_code}" -A "$UA" --max-time 25 "$url" 2>/dev/null)
fi
if [ "$code" = "200" ]; then
echo " PASS panel ${url} ${code}"
else
echo " FAIL panel ${url} 期望 200,实际 ${code:-无响应}"
echo " 提示:aaPanel 及同类面板对非浏览器 UA 返回 404,本脚本已带浏览器 UA"
FAIL=1
fi
}
while [ $# -gt 0 ]; do
case "$1" in
--link) check_link "$2"; shift 2 ;;
--site) check_site "$2"; shift 2 ;;
--panel) PANEL_URL="$2"; shift 2 ;;
--panel-auth) PANEL_AUTH="$2"; shift 2 ;;
-h|--help)
sed -n '2,12p' "$0"; exit 0 ;;
*) echo "未知参数:$1"; exit 2 ;;
esac
done
if [ -n "${PANEL_URL:-}" ]; then
check_panel "$PANEL_URL" "${PANEL_AUTH:-}"
fi
echo
if [ "$CHECKS" -eq 0 ]; then
echo "没有给任何检查项(--link / --site / --panel),这不叫通过"
exit 2
fi
if [ "$FAIL" -eq 0 ]; then
echo "全部通过"
else
echo "存在失败项,按上面的 FAIL 行定位"
fi
exit "$FAIL"