EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

让 SSH 协议通过代理

摘要

本文介绍了在 Linux 和 Windows 系统下修改 ssh 配置文件使 ssh 协议访问 Github 时通过代理的解决方案。该方案同样适用于 ssh 访问其他网站时。

问题背景

从前天开始,Linux 台式机和 Windows 笔记本都不能对 Github 仓库进行 clone 和 push,表现为 clone 和 push 时链接超时。推测是网络环境发生变化导致网路不通。但浏览器此时可以正常访问 Github 和 google 等网站。

Github 目前已经不支持通过 http 协议进行 clone,只有 ssh 协议可行。笔者尝试使 ssh 协议通过代理。

解决思路

在 ssh 的配置文件 /.ssh/config 中配置 ssh 要使用的代理地址和端口。

Windows 方案

Windows 的 ssh 配置文件在 C:\Users\37756\.ssh\config。在配置文件中添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ProxyCommand "C:\Program Files\Git\mingw64\bin\connect.exe" -S 127.0.0.1:7890 -a none %h %p # 使用到 git 自带的 connect,7890 是代理端口号

Host github.com
Hostname ssh.github.com
IdentityFile "C:\Users\37756\.ssh\id_rsa" # 这是 ssh 密钥
User git
Port 22
ProxyCommand "C:\Program Files\Git\mingw64\bin\connect.exe" -S 127.0.0.1:7890 %h %p
TCPKeepAlive yes

Host ssh.github.com
Hostname ssh.github.com
IdentityFile "C:\Users\37756\.ssh\id_rsa"
User git
Port 443
ProxyCommand "C:\Program Files\Git\mingw64\bin\connect.exe" -S 127.0.0.1:7890 %h %p
TCPKeepAlive yes

Linux 方案

Linux 的 ssh 配置文件在 ~/.ssh/config。在配置文件中添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ProxyCommand netcat -X connect -x 127.0.0.1:7890 %h %p # 使用 netcat 或 nc 命令代替 connect,其中 -X connect 表示使用 https 协议

Host github.com
Hostname ssh.github.com
IdentityFile "~/.ssh/id_rsa"
User git
Port 22
ProxyCommand netcat -X connect -x 127.0.0.1:7890 %h %p
TCPKeepAlive yes

Host ssh.github.com
Hostname ssh.github.com
IdentityFile "~/.ssh/id_rsa"
User git
Port 443
ProxyCommand netcat -X connect -x 127.0.0.1:7890 %h %p
TCPKeepAlive yes

总结

修改配置文件后,检查 ssh 协议的连通情况:

1
2
3
4
5
6
eaglebear2002@ubt-pc:~/.ssh$ ssh -T git@github.com
The authenticity of host 'ssh.github.com (<no hostip for proxy command>)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This host key is known by the following other names/addresses:
~/.ssh/known_hosts:1: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])?

连通后即可正常 clone 和 push。