如何通过 SOCKS5 代理在 Git 中使用 SSH 协议
在日常使用 Git 时,我们常常会遇到需要通过代理访问 GitHub 或其他 Git 服务器的场景。大多数情况下,代理设置都是针对 HTTPS 协议的(如设置 https.proxy
)。但是,如果我们使用的是 SSH 协议来克隆、拉取或推送代码,Git 并不会自动使用我们设置的代理。为了让 Git 在使用 SSH 协议时也能够通过 SOCKS5 代理连接,我们需要做一些额外的配置。
问题背景
我们可能已经尝试过以下的方式来通过代理下载或上传代码:
git config --global https.proxy socks5://127.0.0.1:10809
但是,当我们使用 git clone [email protected]:user/repo.git
命令时,它并不会通过我们指定的 SOCKS5 代理连接,因为 Git 的 SSH 连接默认并不支持 https.proxy
和 http.proxy
这些设置。
解决方案
实际上,我们可以通过自定义 Git 使用的 SSH 命令来强制它通过 SOCKS5 代理连接。具体步骤如下:
步骤 1: 创建一个 SSH 代理
首先,我们需要使用 ssh -D
命令在本地开启一个 SOCKS5 代理。这会在本地的 10809 端口上启动一个 SOCKS5 代理服务。
ssh -D 10809 -qCN [email protected]
-D 10809
表示在本地开启 SOCKS5 代理,监听127.0.0.1:10809
。-q
是安静模式,减少输出。-C
启用压缩。-N
表示不执行任何命令,只建立隧道。[email protected]
是我们用来建立 SSH 隧道的远程服务器地址。
执行该命令后,我们将能够通过本地的 127.0.0.1:10809
来访问 SOCKS5 代理。
步骤 2: 配置 Git 使用 SSH 代理
接下来,我们需要告知 Git 在使用 SSH 协议时,也通过 SOCKS5 代理进行连接。我们可以通过配置 Git 的 core.sshCommand
来实现这一点。
有多种方式可以配置 Git 以使用 SOCKS5 代理:
1. 临时设置(当前脚本中使用)
在 Git 命令执行时,使用环境变量 GIT_SSH_COMMAND
来指定自定义的 SSH 连接命令:
export GIT_SSH_COMMAND='ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"'
这将让 Git 在执行 SSH 操作时通过本地的 SOCKS5 代理连接。
2. 全局设置(对所有仓库生效)
我们可以将该配置保存为全局设置,使其对所有 Git 仓库都生效:
git config --global core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"'
这样,Git 在执行任何 SSH 操作时都会自动通过 SOCKS5 代理连接。
3. 一次性使用(仅当前操作生效)
如果我们只想在某次操作中使用代理,而不修改全局设置,可以在执行 Git 操作时指定:
git clone -c core.sshCommand='ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"' [email protected]:user/repo.git
4. 仓库级别设置(仅当前仓库生效)
如果我们只想在某个特定仓库中使用 SOCKS5 代理,可以在该仓库中执行以下命令:
git config core.sshCommand 'ssh -o ProxyCommand="connect -S 127.0.0.1:10809 %h %p"'
步骤 3: 安装 connect
命令
为了使上面的 ProxyCommand
工作,系统需要安装 connect
工具。我们可以通过以下命令在 Debian 系统中安装 connect-proxy
:
sudo apt install connect-proxy
connect
是一个工具,允许我们通过 SOCKS5 代理建立连接。
通过上述配置,我们就可以通过 SOCKS5 代理来操作 Git 的所有 SSH 连接,包括克隆、拉取、推送等操作。