问题景象

本文以Windows零碎为例进行阐明,在个人电脑上应用Git命令来操作GitHub上的我的项目,原本都很失常,忽然某一天开始,会提醒如下谬误ssh: connect to host github.com port 22: Connection refused

$ git pullssh: connect to host github.com port 22: Connection refusedfatal: Could not read from remote repository.Please make sure you have the correct access rightsand the repository exists.

排查思路

ssh: connect to host github.com port 22: Connection refused这个谬误提醒的是连贯github.com的22端口被回绝了。

本来认为github.com挂了,然而浏览器拜访github.com一切正常。

网上搜寻这个报错,发现很多人遇到这个问题,大略有2个起因和对应解决方案:

应用GitHub的443端口

22端口可能被防火墙屏蔽了,能够尝试连贯GitHub的443端口。

$ vim ~/.ssh/config```# Add section below to itHost github.com  Hostname ssh.github.com  Port 443```$ ssh -T git@github.comHi xxxxx! You've successfully authenticated, but GitHub does notprovide shell access.

这个解决方案的思路是:给~/.ssh/config文件里增加如下内容,这样ssh连贯GitHub的时候就会应用443端口。

Host github.com  Hostname ssh.github.com  Port 443

如果~/.ssh目录下没有config文件,新建一个即可。

批改完~/.ssh/config文件后,应用ssh -T git@github.com来测试和GitHub的网络通信是否失常,如果提醒`Hi xxxxx! You've successfully authenticated, but GitHub does not
provide shell access.` 就示意一切正常了。

然而,这个计划在我这里行不通,批改后还是提醒ssh: connect to host github.com port 443: Connection refused

这个计划无效的前提是:执行命令ssh -T -p 443 git@ssh.github.com后不再提醒connection refused,所以要尝试这个计划的小伙伴先执行这条命令测试下。

应用https协定,不要应用ssh协定

在你的GitHub的本地repo目录,执行如下命令:

$ git config --local -e

而后把外面的url配置项从git格局

url = git@github.com:username/repo.git

批改为https格局

url = https://github.com/username/repo.git

这个其实批改的是repo根目录下的./git/config文件。

然而这个办法在我这里同样不失效

解决方案

网上的招都没用,只能自力更生了。既然和GitHub建设ssh连贯的时候提醒connection refused,那咱们就具体看看建设ssh连贯的过程中产生了什么,能够应用ssh -v命令,-v示意verbose,会打出具体日志。

$ ssh -vT git@github.comOpenSSH_9.0p1, OpenSSL 1.1.1o  3 May 2022debug1: Reading configuration data /etc/ssh/ssh_configdebug1: Connecting to github.com [::1] port 22.debug1: connect to address ::1 port 22: Connection refuseddebug1: Connecting to github.com [127.0.0.1] port 22.debug1: connect to address 127.0.0.1 port 22: Connection refusedssh: connect to host github.com port 22: Connection refused

从下面的信息马上就发现了诡异的中央,连贯github.com的地址竟然是::1127.0.0.1。前者是IPV6的localhost地址,后者是IPV4的localhost地址。

到这里问题就很明确了,是DNS解析出问题了,导致github.com域名被解析成了localhost的ip地址,就天然连不上GitHub了。

Windows下执行ipconfig /flushdns 分明DNS缓存后也没用,最初批改hosts文件,减少一条github.com的域名映射搞定。

140.82.113.4 github.com

查找github.com的ip地址能够应用https://www.ipaddress.com/来查问,也能够应用nslookup命令

nslookup github.com 8.8.8.8

nslookup是域名解析工具,8.8.8.8是Google的DNS服务器地址。间接应用

nslookup github.com

就会应用本机曾经设置好的DNS服务器进行域名解析,ipconfig /all能够查看本机DNS服务器地址。

这个问题其实就是DNS解析被净化了,有2种可能:

  • DNS解析被运营商劫持了
  • 应用了迷信上网工具

依照我下面写的解决方案操作即可解决。

开源地址

文章和示例代码开源在GitHub: Go语言高级、中级和高级教程。

公众号:coding进阶。关注公众号能够获取最新Go面试题和技术栈。

集体网站:Jincheng's Blog。

知乎:无忌。

References

  • https://chaxuri.com/archives/...
  • https://stackoverflow.com/que...
  • https://docs.github.com/en/au...
  • https://gist.github.com/Tamal...