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

浙公网安备 33010602011771号