block-proxy 0.1.8 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env sh
2
+
3
+ # --- 参数检查 ---
4
+ if [ $# -eq 0 ]; then
5
+ echo "用法: $0 <URL> [TARGET_IP]"
6
+ echo "说明: 若提供 TARGET_IP,则绕过 DNS,直连该 IP 并使用 URL 中的域名作为 SNI/Host"
7
+ echo "示例:"
8
+ echo " $0 https://www.taobao.com"
9
+ echo " $0 https://www.taobao.com 211.100.8.95"
10
+ exit 1
11
+ fi
12
+
13
+ URL="$1"
14
+ TARGET_IP="${2:-}" # 第二个参数可选
15
+ PROXY="socks5://127.0.0.1:1081"
16
+ TUNNEL_PID=""
17
+ SOCAT_LOG="/tmp/socat_error.log"
18
+
19
+ # --- 从 URL 提取主机名(用于 --resolve 和 SNI)---
20
+ # 移除协议头,再截断路径和端口
21
+ HOST=$(echo "$URL" | sed -E 's|^[^:]+://||' | sed -E 's|/.*$||' | sed -E 's/:.*$//')
22
+ PORT="443"
23
+
24
+ cleanup() {
25
+ if [ -n "$TUNNEL_PID" ]; then
26
+ # 检查进程是否存在
27
+ if kill -0 "$TUNNEL_PID" 2>/dev/null; then
28
+ echo "" >&2
29
+ # echo "🛑 正在终止 socat 隧道 (PID: $TUNNEL_PID)..." >&2
30
+ kill "$TUNNEL_PID" 2>/dev/null
31
+
32
+ # 等待最多 1 秒让它优雅退出
33
+ i=0
34
+ while kill -0 "$TUNNEL_PID" 2>/dev/null && [ $i -lt 10 ]; do
35
+ sleep 0.1
36
+ i=$((i + 1))
37
+ done
38
+
39
+ # 如果还在,强制杀死
40
+ if kill -0 "$TUNNEL_PID" 2>/dev/null; then
41
+ echo "⚠️ 强制终止 socat..." >&2
42
+ kill -9 "$TUNNEL_PID" 2>/dev/null
43
+ fi
44
+
45
+ # 清理僵尸进程
46
+ wait "$TUNNEL_PID" 2>/dev/null
47
+ fi
48
+ fi
49
+ rm -f "$SOCAT_LOG"
50
+ exit "${1:-0}"
51
+ }
52
+
53
+ trap cleanup EXIT INT TERM
54
+
55
+ # --- 检查本地端口 1081 是否已被占用 ---
56
+ if command -v ss >/dev/null 2>&1; then
57
+ if ss -tuln 2>/dev/null | grep -q ':1081\b'; then
58
+ echo "⚠️ 警告: 本地端口 1081 已被占用,socat 可能启动失败。"
59
+ fi
60
+ elif command -v netstat >/dev/null 2>&1; then
61
+ if netstat -tuln 2>/dev/null | grep -q ':1081\b'; then
62
+ echo "⚠️ 警告: 本地端口 1081 已被占用,socat 可能启动失败。"
63
+ fi
64
+ fi
65
+
66
+ # --- 启动 socat 隧道,并记录错误 ---
67
+ echo "🔌 正在启动隧道: socat → OPENSSL:yui.cool:8002 ..."
68
+ socat TCP-LISTEN:1081,fork,bind=127.0.0.1 OPENSSL:yui.cool:8002,verify=0 >"$SOCAT_LOG" 2>&1 &
69
+ TUNNEL_PID=$!
70
+ sleep 0.5
71
+
72
+ # --- 检查 socat 是否仍在运行 ---
73
+ if ! kill -0 "$TUNNEL_PID" 2>/dev/null; then
74
+ echo "❌ 隧道启动失败!socat 报错如下:"
75
+ if [ -s "$SOCAT_LOG" ]; then
76
+ cat "$SOCAT_LOG"
77
+ else
78
+ echo "(无详细错误,可能进程立即崩溃)"
79
+ fi
80
+ exit 1
81
+ else
82
+ : > "$SOCAT_LOG" # 清空日志
83
+ fi
84
+
85
+ # --- 构建 curl 命令 ---
86
+ CURL_CMD="curl -k -I --proxy '$PROXY'"
87
+
88
+ if [ -n "$TARGET_IP" ]; then
89
+ CURL_CMD="$CURL_CMD --resolve '$HOST:$PORT:$TARGET_IP'"
90
+ echo "🌐 绕过 DNS: 直连 $TARGET_IP,SNI = $HOST"
91
+ else
92
+ echo "🌐 使用代理解析 DNS(常规模式)"
93
+ fi
94
+
95
+ echo "📡 请求: $URL via $PROXY"
96
+
97
+ # --- 执行 curl 并计时 ---
98
+ FINAL_CMD="$CURL_CMD $URL"
99
+
100
+ echo "$FINAL_CMD"
101
+
102
+ { time_output=$( { time eval "$FINAL_CMD"; } 2>&1 1>&3 ); } 3>&1
103
+ exit_code=$?
104
+
105
+ # --- 提取状态行 ---
106
+ status_line=$(printf "%s\n" "$time_output" | head -n 1)
107
+
108
+ if [ "$exit_code" -eq 0 ]; then
109
+ echo "✅ 响应状态: $status_line"
110
+ else
111
+ echo "❌ 请求失败(退出码: $exit_code)"
112
+ [ -n "$status_line" ] && echo "⚠️ 部分响应: $status_line"
113
+ fi
114
+
115
+ # --- 显示耗时 ---
116
+ real_time=$(printf "%s\n" "$time_output" | grep "^real" | awk '{print $2}')
117
+ if [ -n "$real_time" ]; then
118
+ echo "⏱️ 耗时: $real_time"
119
+ else
120
+ echo "⚠️ 无法获取耗时(shell 不支持 time 内置命令的格式)"
121
+ fi
122
+
Binary file