aileeao / setup_ssh_with_proxy.sh
aihuashanying's picture
修复不能push的问题
386b079
#!/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