File size: 4,341 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
#!/bin/bash

echo "=== 尝试不同的 SSH 连接方法 ==="
echo ""

WSL_HOST_IP=$(ip route show | grep default | awk '{print $3}')
echo "Windows 主机 IP: $WSL_HOST_IP"
echo "混合代理端口: 7897"
echo ""

SSH_CONFIG="$HOME/.ssh/config"
KEY_PATH="$HOME/.ssh/id_ed25519"

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

# 方法 1: 尝试 SOCKS5(混合端口通常也支持 SOCKS5)
echo "方法 1: 尝试使用 SOCKS5 通过混合端口..."
if command -v nc > /dev/null 2>&1; then
    # 删除旧的 hf.co 配置
    if grep -q "Host hf.co" "$SSH_CONFIG" 2>/dev/null; then
        sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG"
    fi
    
    cat >> "$SSH_CONFIG" << EOF

# Hugging Face SSH 配置(SOCKS5 via nc)
Host hf.co
    HostName hf.co
    User git
    Port 443
    IdentityFile $KEY_PATH
    IdentitiesOnly yes
    StrictHostKeyChecking accept-new
    ConnectTimeout 15
    ProxyCommand nc -X 5 -x $WSL_HOST_IP:7897 %h %p
    ServerAliveInterval 30
    ServerAliveCountMax 3
    TCPKeepAlive yes
EOF
    chmod 600 "$SSH_CONFIG"
    
    echo "测试连接..."
    timeout 20 ssh -T [email protected] 2>&1 | head -10
    if [ $? -eq 0 ] || [ $? -eq 1 ]; then
        echo ""
        echo "✓ 方法 1 成功!使用 SOCKS5"
        exit 0
    fi
    echo "✗ 方法 1 失败"
    echo ""
fi

# 方法 2: 使用 socat(如果可用)
if command -v socat > /dev/null 2>&1; then
    echo "方法 2: 尝试使用 socat (SOCKS5)..."
    if grep -q "Host hf.co" "$SSH_CONFIG" 2>/dev/null; then
        sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG"
    fi
    
    cat >> "$SSH_CONFIG" << EOF

# Hugging Face SSH 配置(SOCKS5 via socat)
Host hf.co
    HostName hf.co
    User git
    Port 443
    IdentityFile $KEY_PATH
    IdentitiesOnly yes
    StrictHostKeyChecking accept-new
    ConnectTimeout 15
    ProxyCommand socat - SOCKS5:$WSL_HOST_IP:7897:%h:%p,socksport=7897
    ServerAliveInterval 30
    ServerAliveCountMax 3
    TCPKeepAlive yes
EOF
    chmod 600 "$SSH_CONFIG"
    
    echo "测试连接..."
    timeout 20 ssh -T [email protected] 2>&1 | head -10
    if [ $? -eq 0 ] || [ $? -eq 1 ]; then
        echo ""
        echo "✓ 方法 2 成功!使用 socat"
        exit 0
    fi
    echo "✗ 方法 2 失败"
    echo ""
fi

# 方法 3: 直接连接(依赖 TUN 模式自动代理)
echo "方法 3: 尝试直接连接(依赖 TUN 模式自动代理)..."
if grep -q "Host hf.co" "$SSH_CONFIG" 2>/dev/null; then
    sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG"
fi

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 15
    ServerAliveInterval 30
    ServerAliveCountMax 3
    TCPKeepAlive yes
EOF
chmod 600 "$SSH_CONFIG"

echo "测试连接(TUN 模式)..."
timeout 20 ssh -T [email protected] 2>&1 | head -10
if [ $? -eq 0 ] || [ $? -eq 1 ]; then
    echo ""
    echo "✓ 方法 3 成功!使用 TUN 模式自动代理"
    exit 0
fi
echo "✗ 方法 3 失败"
echo ""

# 方法 4: 使用环境变量 + connect-proxy(HTTP)
echo "方法 4: 使用环境变量 + connect-proxy..."
if grep -q "Host hf.co" "$SSH_CONFIG" 2>/dev/null; then
    sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG"
fi

cat >> "$SSH_CONFIG" << EOF

# Hugging Face SSH 配置(HTTP 代理 + 环境变量)
Host hf.co
    HostName hf.co
    User git
    Port 443
    IdentityFile $KEY_PATH
    IdentitiesOnly yes
    StrictHostKeyChecking accept-new
    ConnectTimeout 15
    ProxyCommand connect-proxy -H $WSL_HOST_IP:7897 %h %p
    ServerAliveInterval 30
    ServerAliveCountMax 3
    TCPKeepAlive yes
EOF
chmod 600 "$SSH_CONFIG"

export http_proxy=http://$WSL_HOST_IP:7897
export https_proxy=http://$WSL_HOST_IP:7897

echo "测试连接(带环境变量)..."
timeout 20 ssh -T [email protected] 2>&1 | head -10
if [ $? -eq 0 ] || [ $? -eq 1 ]; then
    echo ""
    echo "✓ 方法 4 成功!"
    exit 0
fi
echo "✗ 方法 4 失败"
echo ""

echo "=== 所有方法都失败了 ==="
echo ""
echo "请检查:"
echo "1. SSH 公钥是否已添加到 Hugging Face"
echo "2. Clash Verge 的混合代理端口是否正确配置"
echo "3. 尝试在 Windows 上直接测试代理是否工作"