碎碎念
由于网络原因,我们不得不使用一些手段,以疏通或者加速它。
在 CMD/PowerShell 终端配置代理,可以允许整个命令行得到代理。
使用 git config 配置代理,则仅支持 git 自身获得代理。
CMD 设置代理
Windows 的 cmd 使用 set
命令来配置:
> set http_proxy=http://127.0.0.1:1080
# Or
> set https_proxy=https://127.0.0.1:1080
这种方式,可以进行终端全局的代理。
Windows 还有 PowerShell 终端,也是类似的。
PowerShell 设置代理
PowerShell 配置方式比较特殊,但同样是设置全局变量 HTTP_PROXY/HTTPS_PROXY
(不区分大小写):
> $env:HTTP_PROXY="http://127.0.0.1:1080"
# Or
> $env:HTTPS_PROXY="https://127.0.0.1:1080"
注: 终端配置的方式,每次关闭之后,都要重新配置。除了写一段初始化脚本,还可以直接配置 git 的全局代理。
Git Bash 设置代理
在 Git Bash 中,可以通过 git config
设置 HTTP 代理:
> git config --global http.proxy "http://127.0.0.1:1080"
# Or
> git config --global https.proxy "https://127.0.0.1:1080"
但是,这种方式仅适用于 HTTP/HTTPS,不适用于 SSH 方式(即 git clone git@github.com:username/repo.git
)。
如果要使用 SSH 方式通信,需要配置 Git 的 ~/.ssh/config
。
注意
直接配置 git 的代理,会永久保存,所有 git 连接都走代理。如果代理服务器不在线,会导致 git 无法推送/拉取,需要重置代理配置:
> git config --global --unset http.proxy
SSH 方式代理配置
使用 https 的方式有个缺点,就是输入账号密码,而使用 ssh 方式可以自动使用密钥验证。
打开 ~/.ssh/config
添加配置(不存在则创建一个):
Host github.com
User Spring # 用户名
IdentityFile "C:\Users\springx\.ssh\id_rsa" # 私钥
ProxyCommand "D:\OpenSSH-Win64\bin\nc.exe" -X 5 -x 127.0.0.1:1080 %h %p # 连接代理
ProxyCommand
是 OpenSSH 配置文件中用于指定在建立 SSH 连接时,通过代理服务器进行连接的命令。它允许你在 SSH 客户端和 SSH 服务器之间建立一个额外的中间连接,通过该中间连接来传输 SSH 流量。
这里使用 nc(ncat - Concatenate and redirect sockets) 网络工具,CentOS 直接安装 nc,Ubuntu 是 netcat,Windows 下可以安装 OpenSSH,或者借用其他程序携带的 nc.exe(我使用的是 MobaXterm 内置的 nc.exe)
X
:socks 版本号(代理服务器的类型,常见的类型包括 http、https 和 socks5)- HTTPS:没有连接,暂时无法验证
- HTTP:
ProxyCommand nc -X connect -x <HOST>:<PORT> %h %p
(不用 -X 参数可以连接,未验证)
x
:指定代理服务器 ip 和端口号%h %p
:变量,分别表示 github 的 host 和 ssh 端口号(默认 22)
Linux
在 Linux 中为命令行设置代理,与 Windows 的 CMD 方式一致:
> export http_proxy=http://127.0.0.1:1080
# Or
> export https_proxy=https://127.0.0.1:1080
QA?
- 仅设置 http 代理就可以正常访问 https,这是代理本身提供 http 的原因?
这里的 HTTP 代理并不是指要代理 HTTP 协议的请求,而是指数据从软件(浏览器)到代理客户端的通信方式,本机的代理客户端开启的连接方式为 HTTP,这中间的数据是明文传输的,有被泄露的风险。
而 HTTPS 代理的核心思路,就是使用 https/tls 对浏览器到代理这一段的通信进行加密,这样中间节点就不能监听数据。
这里参考:“允许来自局域网的连接” 到底怎么用
References
[1] FrozenMap. 为 git bash 设置代理. https://jjayyyyyyy.github.io/2019/08/11/git_bash_proxy.html
, 2019-08-11.
[2] 咕咕. ssh 的高级用法 - ProxyCommand. https://bugwz.com/2019/10/09/ssh-proxycommand/
, 2019-10-09.
- 2023-12-05 edited -