#!/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