Git SSH错误:"连接主机:坏文件号"

154

我按照git指南进行操作,但在尝试连接github时出现了奇怪的问题:

$ ssh -v git@github.com
OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007
debug1: Reading configuration data /c/Documents and Settings/mugues/.ssh/config
debug1: Applying options for github.com
debug1: Connecting to github.com [207.97.227.239] port 22.
debug1: connect to address 207.97.227.239 port 22: Attempt to connect timed out without establishing a connection
ssh: connect to host github.com port 22: Bad file number

这是我在 .ssh 文件夹下的配置文件

Host github.com
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile "C:\Documents and Settings\mugues\.ssh\id_rsa"
    TCPKeepAlive yes
    IdentitiesOnly yes

有任何想法吗?


今天接到这个消息,看起来 Github 出现故障了。 - ysrb
TL;DR: 忽略 "bad file number"。你要找的信息不在那个消息中。它可能意味着任何事情。详见https://dev59.com/k2w05IYBdhLWcg3wmC6_#22788046。 - Stéphane Gourichon
19个回答

188

我发现了一个对我有效的解决方案,可以解决这个问题:

错误信息:

    ssh -v git@github.com
    OpenSSH_5.8p1, OpenSSL 1.0.0d 8 Feb 2011
    debug1: Connecting to github.com [207.97.227.239] port 22.
    debug1: connect to address 207.97.227.239 port 22: Connection timed out
    ssh: connect to host github.com port 22: Connection timed out
    ssh: connect to host github.com port 22: Bad file number

你只会在使用MINGGW shell的Windows上看到"bad file number"错误消息。Linux用户只会看到“超时”消息。 问题:

SSH端口22可能被阻止了。你可以通过输入以下命令来查看:

    $nmap -sS github.com -p 22
    Starting Nmap 5.35DC1 ( http://nmap.org ) at 2011-11-05 10:53 CET
    Nmap scan report for github.com (207.97.227.239)
    Host is up (0.10s latency).
    PORT   STATE    SERVICE
    22/tcp ***filtered*** ssh

    Nmap done: 1 IP address (1 host up) scanned in 2.63 seconds

如您所见,状态为Filtered,这意味着某些东西正在阻止它。 您可以通过执行SSH到端口443(您的防火墙/ISP不会阻止此操作)来解决此问题。 同样重要的是,您需要ssh到“ssh.github.com”而不是github.com。 否则,您将报告给Web服务器而不是SSH服务器。 以下是解决此问题所需的所有步骤。
解决方案:
(首先,请确保按照http://help.github.com/win-set-up-git/中的说明生成了密钥)
创建文件~/.ssh/config(ssh配置文件位于用户目录中。在Windows上可能是%USERPROFILE%\.ssh\config
将以下代码粘贴到其中:
    Host github.com
    User git
    Hostname ssh.github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa
    Port 443

保存文件。

像平常一样执行ssh:

$ssh -T github.com 
    $Enter passphrase for key '.......... (you can smile now :))

请注意,我不必提供用户名或端口号。

4
换句话说,你可以通过HTTPS端口建立SSH连接。详见:https://help.github.com/articles/using-ssh-over-the-https-port。 - Enrico Campidoglio
1
在“将以下代码粘贴到其中:”处,我不明白。我应该如何解决坏文件号?我应该创建它并保存为记事本文件吗? - David Dimalanta
27
我收到的反馈是 ssh: connect to host ssh.github.com port 443: Bad file number - ZK Zhao
这个方法同样适用于bitbucket.org,当我之前正常工作的设置突然停止工作时。最好的部分是,我所要做的唯一事情就是修改SSH配置文件。 - Kevin Condon
2
在Windows 7上使用.ssh/config文件时,请确保您拥有一个名为HOME的用户环境变量,其值为%USERPROFILE%。当我的ssh找不到它时,这对我很有帮助。 - Jook
显示剩余2条评论

40

关键信息写在@Sam的回答中,但不太显眼,让我们澄清一下。

"Bad file number"并没有提供有效信息,它只是在Windows上运行git的ssh的标志。

即使没有-v开关,也会出现下面这行:

ssh: connect to host (some host or IP address) port 22: Bad file number

实际上是无关紧要的。

如果你专注于它,你会浪费时间,因为它并没有提示实际问题是什么,只是在Windows上运行git的ssh的一个影响。这甚至不是git或ssh安装或配置错误的标志。真的,忽略它

在Linux上,相同的命令为我提供了一个关于问题的实际提示:

ssh: connect to host (some host or IP address) port 22: Connection timed out

实际解决方案:忽略 "bad file number" 并获取更多信息

关注在使用命令行时添加 -v 的行。在我的情况下,它是:

debug1: connect to address (some host or IP address) port 22: Attempt to connect timed out without establishing a connection

我的问题是IP地址中有一个打字错误,但你的问题可能不同。

这个问题是关于“bad file number”,还是关于连接超时的许多原因?

如果有人能证明“bad file number”只出现在实际原因是“连接超时”的情况下,那么解决连接超时的原因就有些道理了。

在那之前,“bad file number”只是一个通用的错误消息,回答这个问题的方法是“忽略它,寻找其他错误消息”。

编辑:Qwertie提到错误消息确实是通用的,因为它也可能发生在“连接被拒绝”的情况下。这证实了分析结果。

请不要用一般性的提示和答案来混淆这个问题,它们与这个问题的实际主题(和标题)“Git SSH error: “Connect to host: Bad file number””无关。如果使用-v,你会得到更详细的信息,值得开另一个问题来讨论,然后你可以将它链接到这里。


1
是的,将-v添加到我的scp命令行后面添加了"debug1: connect to address 216.34.181.70 port 22: Connection refused"这句话,然后才显示"Bad file number",所以它并不总是一个"timed out"错误。 - Qwertie
哦,Windows总是显示模糊的错误消息,即使该工具在Linux和其他类UNIX系统上被传统使用... - lilydjwg

15

这对我有用:

ssh -v git@github.com -p 443

5

你也可以尝试:

telnet example.com 22

检查您是否可以连接到服务器。我看到这条消息后发现我的VPN阻止了访问。断开VPN连接,问题得到解决。


5
也许你的防火墙或者类似PeerBlock等的拦截应用程序正在阻塞你的端口。

4
我发现这种情况通常是由于你的网络连接不稳定所致。我之前在推送代码到仓库时也遇到过类似问题,一直失败,后来发现连接已经断开了。
等连接重新建立后,推送就成功了。我认为这可能是因为你或者对方的网络连接出现了中断导致的。

1
当我使用我的Verizon Jetpack时,我也遇到了这个错误,似乎在我从两个不同的设备上使用ssh时,Jetpack会断开我的连接。因此,Jetpack中的某些内容正在断开连接,当连接断开时,我会收到“坏文件号”错误。 - cod3monk3y
1
当我使用手机热点连接我的笔记本电脑时,出现了这个错误。 - Lucas

3

如果 SSH 在 22 端口被阻止了

只需将您的 origin 更新为 https

git remote set-url origin https://github.com/ACCOUNT_NAME/REPO_NAME.git

验证更改是否生效

git remote -v


正确,但是您需要对每个存储库使用此方法进行操作。在配置文件中,它应用于全局。 - Sam

2

尝试退出你设置过程中使用的 git bash 实例,然后重新打开。这对我最终有用。


10
最终 对我起作用”这句话让我想到,在这个过程中你可能做了其他事情,这些事情可能有所帮助。 - Jake Berger

1
在我的情况下,我们的git主机IP地址已更改。只需清除DNS缓存即可解决问题。

1

请仔细检查您是否通过GitHub管理界面发布了您的公钥。

然后,请确保端口22没有被阻止(如此问题所示)。


1
首先确保“git”是您的GitHub用户名。如Git指南所述:_测试所有内容。 为确保一切正常,现在您将SSH到GitHub。不要更改“git@github.com”的部分。那应该在那里。 然后确保端口22没有被阻止-->我禁用了Windows XP防火墙,但没有任何变化。 - Massimo Ugues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接