首页 > Tinynote > 记一次解决 github 无法 push 的经历

记一次解决 github 无法 push 的经历

2023年5月15日 发表评论 阅读评论
今天在向 github push 代码的过程中, 突然出现错误:
kex_exchange_identification: Connection closed by remote host
Connection closed by 20.205.243.166 port 22
致命错误:无法读取远程仓库。
请确认您有正确的访问权限并且仓库存在。
搞笑, 我自己的仓库,凭什么我可以 pull 就不可以 push。
一开始是怀疑网络是否有问题,在切换了不同的科学插件以后, 发现还是同样的问题。
那么就是 ssh 密钥的问题了。在确认 id_rsa 没有问题后,重置了 known_hosts .问题依旧没有解决。

经过这一番折腾以后, 我陷入了迷茫。我设置了 http 和 https 的科学插件,git 是否经过了这个插件呢?不一定!我使用的 git@github.com , 即我使用的是ssh, 尽管我打开了全局科学, 但并不代表git的网络经过了插件。于是我向 chatGPT 了解了为ssh 设置代理的方式。它告诉我:
Host github.com
    ProxyCommand /usr/bin/nc -X connect -x <proxy_host>:<proxy_port> %h %p
这回出现了新的错误:
nc: getaddrinfo: nodename nor servname provided, or not known
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535
致命错误:无法读取远程仓库。
请确认您有正确的访问权限并且仓库存在
问题不但没有解决, 反而出现了新的问题。但这也证明了, git 的 ssh 确实没有走全局科学插件。那么 getaddrinfo 又是什么意思呢?可能是DNS的问题。于是我重置了电脑的DNS,问题没有解决。
使用 ssh -vT git@github.com , 发现还是无法连接到 github, 可能是 ProxyCommand 的参数有问题。
ProxyCommand 是指定连接代理服务器时所要使用的命令。
/usr/bin/nc 是 netcat 命令的路径,netcat 是一个可以创建 TCP 连接的工具。
-X connect 是 netcat 的参数,它告诉 netcat 通过代理服务器建立一个连接。
-x <proxy_host>:<proxy_port> 是 netcat 的参数,它指定代理服务器的主机和端口号。
%h 和 %p 是 ssh 的占位符,它们分别表示目标主机名和端口号。在这个语句中,%h 和 %p 将被替换为 github.com 的主机名和端口号。
那么重点来了, connect 参数是是什么意思呢。 使用 nc -h 查一下:
-X proto                      Proxy protocol: "4", "5" (SOCKS) or "connect"
-x addr[:port]                Specify proxy address and port
原来是要指定代理的协议,我原来使用的 http 协议的端口。难怪提示的端口有问题。改一下:
ProxyCommand nc -X 5 -x 127.0.0.1:<port of socks> %h %p
再次执行 git push  , 终于恢复了正常。
唉, 这种不正常的网络环境,真的是坑!
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.