diff --git a/route.sh b/route.sh new file mode 100644 index 0000000..e1e42ed --- /dev/null +++ b/route.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# route.sh 域名 —— 输出该域名在 mihomo 的分流结果,如: DIRECT / PROXY[de1-vless] / REJECT +# 用法: route.sh www.xiaohongshu.com [更多域名...] +# 自适应两套环境(同一份脚本,sysconfig 同步到所有电脑): +# 1) Mac + Clash Verge service:unix socket + 7897(无 TCP API、无需 secret) +# 2) Linux 服务器(如 cn1):TCP API + secret + 7890 +# 可靠性设计:每域名独立一条 8s 日志流(长流/连续流会被内核丢弃),流内 grep 纯域名 +#(JSON 里 "-->" 被转义成 \u003e,不能按 "--> " 前缀匹配) + +# ==== ENV(按需修改)==== +MAC_SOCK="/var/run/clash-verge-service/users/501/verge-mihomo.sock" # Verge service unix socket +CN1_API="http://100.100.86.1:9090" # cn1 mihomo REST API +CN1_SECRET="pl1pool-2026" # cn1 API secret +PROXY_MAC="http://127.0.0.1:7897" # Mac mixed 端口 +PROXY_CN1="http://127.0.0.1:7890" # cn1 mixed 端口 +# ======================== + +command -v curl >/dev/null || { echo "curl is required"; exit 1; } + +# ---- 探测环境:优先 unix socket(Mac),否则 TCP+secret(cn1/其他)---- +if [ -S "$MAC_SOCK" ]; then + MODE="mac" + SOCK_ARGS=(--unix-socket "$MAC_SOCK") + API_URL="http://localhost" + AUTH=() + PROXY="$PROXY_MAC" +else + MODE="tcp" + SOCK_ARGS=() + API_URL="$CN1_API" + AUTH=(-H "Authorization: Bearer $CN1_SECRET") + PROXY="$PROXY_CN1" + PING=$(curl -s -m 5 "${AUTH[@]}" -o /dev/null -w '%{http_code}' "$API_URL/version" 2>/dev/null) + [ "$PING" = "200" ] || { echo "API unreachable: $API_URL (code=$PING) — 检查网络/secret"; exit 1; } +fi + +if [ $# -eq 0 ]; then + echo "Usage: $(basename $0) domain [domain2 ...] (mode: $MODE)" + exit 1 +fi + +# 每域名独立短会话:8s 日志流 + 1s 后请求 + 7s 收尾(此形态实测最稳) +for domain in "$@"; do + LOG=$(mktemp) + curl -s --max-time 8 "${SOCK_ARGS[@]}" "${AUTH[@]}" "$API_URL/logs?level=info" > "$LOG" 2>/dev/null & + LPID=$! + sleep 1 + curl -s -m 5 -x "$PROXY" -o /dev/null "https://$domain" 2>/dev/null + sleep 7 + LINE=$(grep -m1 "$domain" "$LOG" 2>/dev/null | head -1) + if [ -z "$LINE" ]; then + printf "%-40s ?? (no match line captured)\n" "$domain" + else + RESULT=$(echo "$LINE" | sed -n 's/.* match .* using //p' | sed 's/"}$//' | sed 's/"$//') + RULE=$(echo "$LINE" | sed -n 's/.* match \(.*\) using .*/\1/p') + printf "%-40s %-24s (rule: %s)\n" "$domain" "${RESULT:-??}" "${RULE:-?}" + fi + kill $LPID 2>/dev/null; wait $LPID 2>/dev/null; rm -f "$LOG" +done