Spaces:
Running
Running
| echo "=== 诊断并修复 SSH 连接问题 ===" | |
| echo "" | |
| WSL_HOST_IP=$(ip route show | grep default | awk '{print $3}') | |
| echo "Windows 主机 IP: $WSL_HOST_IP" | |
| echo "混合代理端口: 7897" | |
| echo "" | |
| # 1. 测试代理端口是否可达 | |
| echo "1. 测试代理端口连接..." | |
| if timeout 3 bash -c "echo > /dev/tcp/$WSL_HOST_IP/7897" 2>/dev/null; then | |
| echo "✓ 端口 7897 可达" | |
| else | |
| echo "✗ 端口 7897 不可达,请检查 Clash Verge 是否运行" | |
| exit 1 | |
| fi | |
| echo "" | |
| # 2. 测试 HTTP 代理 | |
| echo "2. 测试 HTTP 代理功能..." | |
| export http_proxy=http://$WSL_HOST_IP:7897 | |
| export https_proxy=http://$WSL_HOST_IP:7897 | |
| if curl -s --connect-timeout 5 --proxy "$http_proxy" https://www.google.com > /dev/null 2>&1; then | |
| echo "✓ HTTP 代理工作正常" | |
| HTTP_PROXY_WORKS=true | |
| else | |
| echo "✗ HTTP 代理测试失败" | |
| HTTP_PROXY_WORKS=false | |
| fi | |
| echo "" | |
| # 3. 测试 SOCKS5 代理 | |
| echo "3. 测试 SOCKS5 代理功能..." | |
| if command -v curl > /dev/null 2>&1; then | |
| if curl -s --connect-timeout 5 --socks5-hostname $WSL_HOST_IP:7897 https://www.google.com > /dev/null 2>&1; then | |
| echo "✓ SOCKS5 代理工作正常" | |
| SOCKS5_PROXY_WORKS=true | |
| else | |
| echo "✗ SOCKS5 代理测试失败" | |
| SOCKS5_PROXY_WORKS=false | |
| fi | |
| else | |
| echo "⚠️ curl 未安装,跳过 SOCKS5 测试" | |
| SOCKS5_PROXY_WORKS=false | |
| fi | |
| echo "" | |
| # 4. 检查 netcat 版本和功能 | |
| echo "4. 检查 netcat 功能..." | |
| if command -v nc > /dev/null 2>&1; then | |
| NC_VERSION=$(nc -h 2>&1 | head -1) | |
| echo " netcat 版本: $NC_VERSION" | |
| # 检查是否支持 -X 选项(SOCKS 代理) | |
| if nc -h 2>&1 | grep -q "\-X"; then | |
| echo " ✓ 支持 SOCKS 代理 (-X 选项)" | |
| NC_SUPPORTS_SOCKS=true | |
| else | |
| echo " ✗ 不支持 SOCKS 代理" | |
| NC_SUPPORTS_SOCKS=false | |
| fi | |
| else | |
| echo " ✗ nc 未安装" | |
| NC_SUPPORTS_SOCKS=false | |
| fi | |
| echo "" | |
| # 5. 尝试不同的 SSH 连接方式 | |
| echo "5. 尝试不同的 SSH 连接方式..." | |
| 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 | |
| # 删除旧的 hf.co 配置 | |
| if grep -q "Host hf.co" "$SSH_CONFIG" 2>/dev/null; then | |
| sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG" | |
| fi | |
| # 方案 1: 使用 connect-proxy (HTTP 代理) | |
| if command -v connect-proxy > /dev/null 2>&1 && [ "$HTTP_PROXY_WORKS" = "true" ]; then | |
| echo "尝试方案 1: 使用 connect-proxy (HTTP 代理)..." | |
| 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 10 | |
| ProxyCommand connect-proxy -H $WSL_HOST_IP:7897 %h %p | |
| ServerAliveInterval 60 | |
| ServerAliveCountMax 3 | |
| TCPKeepAlive yes | |
| LogLevel ERROR | |
| EOF | |
| chmod 600 "$SSH_CONFIG" | |
| echo "测试连接..." | |
| timeout 15 ssh -T [email protected] 2>&1 | head -5 | |
| if [ $? -eq 0 ] || [ $? -eq 1 ]; then | |
| echo "✓ 方案 1 成功!" | |
| exit 0 | |
| fi | |
| echo "✗ 方案 1 失败" | |
| echo "" | |
| # 删除配置,尝试下一个方案 | |
| sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG" | |
| fi | |
| # 方案 2: 使用 socat (SOCKS5) | |
| if command -v socat > /dev/null 2>&1 && [ "$SOCKS5_PROXY_WORKS" = "true" ]; then | |
| echo "尝试方案 2: 使用 socat (SOCKS5)..." | |
| 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 10 | |
| ProxyCommand socat - SOCKS5:$WSL_HOST_IP:7897:%h:%p,socksport=7897 | |
| ServerAliveInterval 60 | |
| ServerAliveCountMax 3 | |
| TCPKeepAlive yes | |
| LogLevel ERROR | |
| EOF | |
| chmod 600 "$SSH_CONFIG" | |
| echo "测试连接..." | |
| timeout 15 ssh -T [email protected] 2>&1 | head -5 | |
| if [ $? -eq 0 ] || [ $? -eq 1 ]; then | |
| echo "✓ 方案 2 成功!" | |
| exit 0 | |
| fi | |
| echo "✗ 方案 2 失败" | |
| echo "" | |
| sed -i '/^Host hf.co$/,/^$/d' "$SSH_CONFIG" | |
| fi | |
| # 方案 3: 使用 proxychains | |
| if command -v proxychains4 > /dev/null 2>&1 || command -v proxychains > /dev/null 2>&1; then | |
| echo "尝试方案 3: 使用 proxychains..." | |
| PROXYCHAINS_CMD=$(command -v proxychains4 || command -v proxychains) | |
| # 配置 proxychains | |
| if [ -f /etc/proxychains.conf ]; then | |
| echo " 配置 proxychains..." | |
| sudo sed -i 's/socks4.*127.0.0.1.*9050/socks5 '"$WSL_HOST_IP"' 7897/' /etc/proxychains.conf 2>/dev/null || true | |
| fi | |
| cat >> "$SSH_CONFIG" << EOF | |
| # Hugging Face SSH 配置(基础配置,通过 proxychains 使用) | |
| 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 | |
| chmod 600 "$SSH_CONFIG" | |
| echo "测试连接(使用 proxychains)..." | |
| timeout 15 $PROXYCHAINS_CMD ssh -T [email protected] 2>&1 | head -5 | |
| if [ $? -eq 0 ] || [ $? -eq 1 ]; then | |
| echo "✓ 方案 3 成功!" | |
| echo " 以后使用: $PROXYCHAINS_CMD git push" | |
| exit 0 | |
| fi | |
| echo "✗ 方案 3 失败" | |
| echo "" | |
| fi | |
| # 方案 4: 直接连接(依赖 TUN 模式) | |
| echo "尝试方案 4: 直接连接(依赖 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 | |
| chmod 600 "$SSH_CONFIG" | |
| echo "测试连接(TUN 模式)..." | |
| timeout 15 ssh -T [email protected] 2>&1 | head -5 | |
| if [ $? -eq 0 ] || [ $? -eq 1 ]; then | |
| echo "✓ 方案 4 成功!" | |
| exit 0 | |
| fi | |
| echo "✗ 方案 4 失败" | |
| echo "" | |
| # 如果都失败了,提供安装建议 | |
| echo "=== 所有方案都失败了 ===" | |
| echo "" | |
| echo "建议安装以下工具之一:" | |
| echo "" | |
| echo "1. connect-proxy (HTTP 代理):" | |
| echo " sudo apt-get install connect-proxy" | |
| echo "" | |
| echo "2. socat (SOCKS5 代理):" | |
| echo " sudo apt-get install socat" | |
| echo "" | |
| echo "3. proxychains (通用代理):" | |
| echo " sudo apt-get install proxychains4" | |
| echo "" | |
| echo "或者检查 Clash Verge 的 TUN 模式配置,确保所有流量都被代理" | |