git clone 使用代理 小记

terminal 中我日常用代理是通过自己写的 function 来实现快速 set/unset HTTP/HTTPS proxy
不过昨天通过 SSH 协议进行 git clone 时发现速度很慢

于是有了此篇心得记录

前置条件

如果你日常 git 使用中 不用 SSH 协议 或者 你惯用 TUN 模式,那么你大概不会遇到我的问题

正文

解决问题的工具是 ProxyCommand + nc

ProxyCommand 是什么?

ssh_config(5) 的原文大意:

指定连接服务器所用的命令。命令字符串延伸到行尾,通过用户的 shell 以 exec 方式执行,
以免留下残余 shell 进程。命令应当从 stdin 读、往 stdout 写,最终连到一个 sshd。

该指令适合配合 nc(1) 及其代理功能使用。例如下面这条通过 192.0.2.0 上的 HTTP 代理连接:

ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p

也就是说:ssh 不再自己 TCP 连目标,而是起一个子进程,把自己的标准输入输出接到这个子进程上,
让子进程负责建链。子进程怎么连、走不走代理,ssh 一概不管。

nc 可用的 参数

参数 含义 实测展开
%h 远端主机名(取 HostName 指令的值,没写就取你在命令行敲的) HostName github.com → github.com
%p 远端端口 Port 443 → 443
%n 命令行上原始敲的主机名(不受 HostName 影响) ssh gh → gh
%r 远端用户名
%% 字面 %

实测:Host gh + HostName github.com + Port 443 时,
日志里是 Executing proxy command: exec nc ... github.com 443 —— 用的是 HostName。

nc 连接方式 option

HTTP / HTTPS 代理:-X connect

ProxyCommand nc -X connect -x 127.0.0.1:7890 %h %p

需要带认证的代理请改用 ncat:

ProxyCommand ncat --proxy 127.0.0.1:7890 --proxy-type http --proxy-auth user:pass %h %p

SOCKS5 代理:-X 5

ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p

实际使用

直接一条命令,临时使用

GIT_SSH_COMMAND="ssh -o ProxyCommand='nc -X connect -x 127.0.0.1:7890 %h %p'" git clone git@github.com:user/repo.git

写入 ssh config

~/.ssh/config,注意 ssh_config 是 key value 两列、Host 单独一列 的缩进格式:

Host github
    HostName github.com
    User git
    Port 22
    ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p
通配写法

使用一段 Host * 来给所有 Hosts 附上同一条配置
例外的 Hosts 单独配置

# 例外在前
Host gitlab.com
    ProxyCommand none

Host 61145.example.com 192.168.*  100.64.*
    ProxyCommand none

# 兜底在后
Host *
    ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p

或者

# 通配中直接排除
Host * !github.com !gist.github.com
    ProxyCommand nc -X 5 -x 127.0.0.1:7890 %h %p

实际验证

ssh -vT git@github 确认输出

debug1: Executing proxy command: exec nc -X 5 -x 127.0.0.1:7890 github.com 22
posted @ 2026-10-12 10:56  tfel-ypoc  阅读(10)  评论(0)    收藏  举报