Files

60 lines
2.5 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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