查看某个域名的mihomo分流路径

This commit is contained in:
luk
2026-10-14 13:36:57 +08:00
parent 7be962b105
commit 450592c7c6
+59
View File
@@ -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