File size: 5,037 Bytes
386b079
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#!/bin/bash

echo "=== 配置 SSH 通过 Clash Verge 代理连接 ==="
echo ""

# 1. 检查 Clash 代理设置
echo "1. 检查代理配置..."
echo "检查环境变量:"
echo "  http_proxy: ${http_proxy:-未设置}"
echo "  https_proxy: ${https_proxy:-未设置}"
echo "  all_proxy: ${all_proxy:-未设置}"
echo ""

# 2. 检测 Clash 代理地址(通常是 Windows 主机的 IP)
echo "2. 检测 Clash 代理地址..."
WSL_HOST_IP=$(ip route show | grep -i default | awk '{ print $3}' | head -1)
echo "检测到的 WSL 网关 IP: $WSL_HOST_IP"

# Clash 混合代理端口(同时支持 HTTP 和 SOCKS5)
CLASH_MIXED_PORT=7897

echo "使用混合代理端口: $CLASH_MIXED_PORT"
PROXY_HOST=$WSL_HOST_IP
PROXY_PORT=$CLASH_MIXED_PORT

# 测试端口是否可达
if timeout 2 bash -c "echo > /dev/tcp/$WSL_HOST_IP/$CLASH_MIXED_PORT" 2>/dev/null; then
    echo "✓ 混合代理端口 $CLASH_MIXED_PORT 可达"
else
    echo "⚠️  无法连接到端口 $CLASH_MIXED_PORT,请确认 Clash Verge 配置"
    read -p "  继续配置?(y/n): " continue_setup
    if [ "$continue_setup" != "y" ] && [ "$continue_setup" != "Y" ]; then
        exit 1
    fi
fi
echo ""

# 3. 检查 SSH key
echo "3. 检查 SSH key..."
if [ -f ~/.ssh/id_ed25519.pub ]; then
    echo "✓ 找到 SSH 公钥"
    KEY_PATH="$HOME/.ssh/id_ed25519"
    echo "公钥:"
    cat ~/.ssh/id_ed25519.pub
    echo ""
    echo "⚠️  请确认此公钥已添加到:https://huggingface.co/settings/keys"
    read -p "公钥已添加?(y/n): " key_added
    if [ "$key_added" != "y" ] && [ "$key_added" != "Y" ]; then
        echo "请先添加公钥"
        exit 1
    fi
else
    echo "✗ 未找到 SSH key"
    exit 1
fi
echo ""

# 4. 配置 SSH config
echo "4. 配置 SSH config..."
SSH_CONFIG="$HOME/.ssh/config"

# 备份
if [ -f "$SSH_CONFIG" ]; then
    cp "$SSH_CONFIG" "$SSH_CONFIG.backup.$(date +%Y%m%d_%H%M%S)"
    echo "✓ 已备份现有配置"
fi

# 删除旧的 hf.co 配置
if grep -q "Host hf.co" "$SSH_CONFIG" 2>/dev/null; then
    sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG"
fi

# 使用混合代理端口(支持 SOCKS5)
# 优先使用 SOCKS5,因为 SSH 对 SOCKS5 支持更好
if command -v nc > /dev/null 2>&1; then
    cat >> "$SSH_CONFIG" << EOF

# Hugging Face SSH 配置(通过混合代理端口 7897,使用 SOCKS5)
Host hf.co
    HostName hf.co
    User git
    Port 443
    IdentityFile $KEY_PATH
    IdentitiesOnly yes
    StrictHostKeyChecking accept-new
    ConnectTimeout 10
    ProxyCommand nc -X 5 -x $PROXY_HOST:$PROXY_PORT %h %p
    ServerAliveInterval 60
    ServerAliveCountMax 3
    TCPKeepAlive yes
    LogLevel ERROR
EOF
    echo "✓ 已配置使用 SOCKS5 通过混合代理端口 $PROXY_PORT"
elif command -v connect-proxy > /dev/null 2>&1; then
    # 如果没有 nc,尝试使用 connect-proxy(HTTP 代理)
    cat >> "$SSH_CONFIG" << EOF

# Hugging Face SSH 配置(通过混合代理端口 7897,使用 HTTP)
Host hf.co
    HostName hf.co
    User git
    Port 443
    IdentityFile $KEY_PATH
    IdentitiesOnly yes
    StrictHostKeyChecking accept-new
    ConnectTimeout 10
    ProxyCommand connect-proxy -H $PROXY_HOST:$PROXY_PORT %h %p
    ServerAliveInterval 60
    ServerAliveCountMax 3
    TCPKeepAlive yes
    LogLevel ERROR
EOF
    echo "✓ 已配置使用 HTTP 通过混合代理端口 $PROXY_PORT"
else
    # 如果没有代理工具,依赖 TUN 模式自动代理
    cat >> "$SSH_CONFIG" << EOF

# Hugging Face SSH 配置(TUN 模式,自动代理)
Host hf.co
    HostName hf.co
    User git
    Port 443
    IdentityFile $KEY_PATH
    IdentitiesOnly yes
    StrictHostKeyChecking accept-new
    ConnectTimeout 10
    ServerAliveInterval 60
    ServerAliveCountMax 3
    TCPKeepAlive yes
    LogLevel ERROR
EOF
    echo "⚠️  未找到 nc 或 connect-proxy,使用 TUN 模式自动代理"
    echo "   建议安装 netcat-openbsd: sudo apt-get install netcat-openbsd"
fi

chmod 600 "$SSH_CONFIG"
echo "✓ SSH config 已配置"
echo ""

# 5. 设置 key 权限
chmod 600 "$KEY_PATH"
chmod 644 "$KEY_PATH.pub"
echo "✓ 文件权限已设置"
echo ""

# 6. 测试连接
echo "5. 测试 SSH 连接(10秒超时)..."
echo "如果 TUN 模式正常工作,应该能自动通过代理连接"
echo ""

timeout 15 ssh -T -o ConnectTimeout=10 [email protected] 2>&1
SSH_EXIT=$?

if [ $SSH_EXIT -eq 0 ] || [ $SSH_EXIT -eq 1 ]; then
    echo ""
    echo "✓ SSH 连接成功!"
    echo ""
    echo "=== 配置完成 ==="
    echo "现在可以正常使用 git push 了"
else
    echo ""
    echo "✗ SSH 连接失败"
    echo ""
    echo "可能的原因:"
    echo "1. Clash Verge TUN 模式未正确配置"
    echo "2. 需要手动设置代理环境变量"
    echo ""
    echo "尝试设置代理环境变量:"
    echo "  export http_proxy=http://$PROXY_HOST:$PROXY_PORT"
    echo "  export https_proxy=http://$PROXY_HOST:$PROXY_PORT"
    echo "  export all_proxy=socks5://$PROXY_HOST:$PROXY_PORT"
    echo ""
    echo "或者检查 Clash Verge 的 TUN 模式设置"
fi