#!/bin/bash echo "=== 最终修复方案 ===" echo "" WSL_HOST_IP=$(ip route show | grep default | awk '{print $3}') echo "Windows 主机 IP: $WSL_HOST_IP" echo "" # 先测试 SOCKS5 是否工作 echo "1. 测试 SOCKS5 代理功能..." if command -v curl > /dev/null 2>&1; then if timeout 5 curl -s --socks5-hostname $WSL_HOST_IP:7897 https://www.google.com > /dev/null 2>&1; then echo "✓ SOCKS5 代理工作正常,使用 SOCKS5 方式" USE_SOCKS5=true else echo "✗ SOCKS5 代理测试失败,尝试其他方式" USE_SOCKS5=false fi else echo "⚠️ curl 未安装,假设 SOCKS5 可用" USE_SOCKS5=true fi echo "" # 安装必要的工具 echo "2. 检查并安装必要工具..." if ! command -v nc > /dev/null 2>&1; then echo "安装 netcat-openbsd..." sudo apt-get update -qq sudo apt-get install -y netcat-openbsd fi # 检查 nc 是否支持 SOCKS if nc -h 2>&1 | grep -q "\-X"; then NC_SUPPORTS_SOCKS=true else NC_SUPPORTS_SOCKS=false echo "⚠️ nc 不支持 SOCKS,尝试安装 netcat-openbsd..." sudo apt-get install -y netcat-openbsd if nc -h 2>&1 | grep -q "\-X"; then NC_SUPPORTS_SOCKS=true fi fi echo "" # 配置 SSH 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 # 删除旧的 hf.co 配置 if grep -q "Host hf.co" "$SSH_CONFIG" 2>/dev/null; then sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG" fi # 根据测试结果选择配置方式 if [ "$USE_SOCKS5" = "true" ] && [ "$NC_SUPPORTS_SOCKS" = "true" ]; then echo "3. 配置 SSH(使用 SOCKS5 via nc)..." cat >> "$SSH_CONFIG" << EOF # Hugging Face SSH 配置(SOCKS5) Host hf.co HostName hf.co User git Port 443 IdentityFile $KEY_PATH IdentitiesOnly yes StrictHostKeyChecking accept-new ConnectTimeout 20 ProxyCommand nc -X 5 -x $WSL_HOST_IP:7897 %h %p ServerAliveInterval 30 ServerAliveCountMax 3 TCPKeepAlive yes LogLevel ERROR EOF elif command -v connect-proxy > /dev/null 2>&1; then echo "3. 配置 SSH(使用 HTTP via connect-proxy)..." 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 20 ProxyCommand connect-proxy -H $WSL_HOST_IP:7897 %h %p ServerAliveInterval 30 ServerAliveCountMax 3 TCPKeepAlive yes LogLevel ERROR EOF else echo "3. 配置 SSH(直接连接,依赖 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 20 ServerAliveInterval 30 ServerAliveCountMax 3 TCPKeepAlive yes LogLevel ERROR EOF fi chmod 600 "$SSH_CONFIG" chmod 600 "$KEY_PATH" chmod 644 "$KEY_PATH.pub" echo "✓ SSH 配置已完成" echo "" # 测试连接 echo "4. 测试 SSH 连接..." echo "(这可能需要 10-20 秒)" echo "" timeout 25 ssh -T git@hf.co 2>&1 SSH_EXIT=$? echo "" if [ $SSH_EXIT -eq 0 ] || [ $SSH_EXIT -eq 1 ]; then echo "✓ SSH 连接成功!" echo "" echo "=== 配置完成 ===" echo "现在可以正常使用 git push 了" echo "" echo "注意:如果 Windows 防火墙关闭后可以连接," echo "建议配置防火墙规则允许端口 7897,而不是完全关闭防火墙" else echo "✗ SSH 连接仍然失败" echo "" echo "请运行详细测试:" echo " ./test_socks5.sh" echo " ./try_different_methods.sh" fi