354

我正在尝试连接到位于我的 Web 服务器上的远程 Git 存储库并将其克隆到我的机器上。

我的命令使用以下格式:

git clone ssh://username@domain.com/repository.git

这对我的大多数团队成员来说都很好。通常运行此命令后,Git 会提示输入用户密码,然后运行克隆。但是,在我的一台机器上运行时,出现以下错误:

主机密钥验证失败。

致命:无法从远程存储库中读取。

我们没有使用 SSH 密钥连接到这个存储库,所以我不确定 Git 为什么要在这台特定的机器上检查一个。

4

27 回答 27

546

正如我之前在克隆 git repo 中回答的那样导致错误 - 主机密钥验证失败。致命:远程端意外挂断,将GitHub加入已知主机列表:

ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
于 2015-04-01T00:17:14.907 回答
262

您正在通过 SSH 协议进行连接,如ssh://克隆 URL 上的前缀所示。使用 SSH,每个主机都有一个密钥。客户端记住与特定地址相关联的主机密钥,如果主机密钥出现变化,则拒绝连接。这可以防止中间人攻击。

domain.com 的主机密钥已更改。如果这对您来说并不可疑,请${HOME}/.ssh/known_hosts通过编辑以删除 domain.com 的行或让 SSH 实用程序为您执行此操作,从而从本地缓存中删除旧密钥。

ssh-keygen -R domain.com

从这里,您可以自己记录更新的密钥

ssh-keyscan -t rsa domain.com >> ~/.ssh/known_hosts

或者,等价地,ssh下次您连接git fetch, git pull, 或git push(甚至是普通的 ol' ssh domain.com)时,请在提示时回答“是”,为您执行此操作

无法确定主机“domain.com (abcd)”的真实性。
RSA 密钥指纹为 XX:XX:...:XX。
您确定要继续连接(是/否)?

known_hosts出现这个提示的原因是domain.com在你删除后已经不在了,估计系统的也没有了/etc/ssh/ssh_known_hosts,所以ssh无法知道连接另一端的主机是否真的是domain.com。(如果 中的键不正确/etc,则具有管理权限的人将不得不更新系统范围的文件。)

我强烈建议您考虑让用户也使用密钥进行身份验证。这样,ssh-agent可以方便地存储密钥材料(而不是每个人都必须为每次连接服务器输入密码),并且密码不会通过网络传输。

于 2012-11-13T15:59:18.870 回答
80

我有类似的问题,但是,使用 SSH 密钥。从上面 Tupy 的回答中,我发现问题在于 known_hosts 文件不存在或 github.com 不存在于已知主机列表中。这是我解决它的步骤 -

  1. mkdir -p ~/.ssh
  2. ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
  3. ssh-keygen -t rsa -C "user.email"
  4. 使用此命令打开公钥$ cat ~/.ssh/id_rsa.pub并复制它。
  5. id_rsa.pub密钥添加到 GitHub 配置文件上的 SSH 密钥列表。
于 2015-04-28T00:16:21.833 回答
61

发生这种情况是因为 github 当前不在您的已知主机中。

应该会提示您将 github 添加到您的已知主机。如果这还没有发生,您可以运行ssh -T git@github.com以再次接收提示。

于 2017-11-01T09:46:47.413 回答
24

对我来说,我只需要在询问“你确定要继续连接(是/否)吗?”的提示符下输入“是”。而不仅仅是按 Enter。

于 2017-08-02T22:51:53.143 回答
12

如果您在始终受防火墙保护的办公室内部网(否则很危险)中,只需在您的~/.ssh/config.

Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
于 2017-03-04T01:40:29.913 回答
9

我在新安装的系统上遇到了同样的问题,但这是一个 udev 问题。没有/dev/tty节点,所以我不得不这样做:

mknod -m 666 /dev/tty c 5 0
于 2013-08-06T12:04:09.183 回答
8

当被问及:

Are you sure you want to continue connecting (yes/no)?

键入yes作为响应

这就是我解决问题的方法。但是,如果您尝试仅按 Enter 按钮,它将无法正常工作!

于 2019-04-22T07:10:50.993 回答
6

对我有用的是首先添加我的新计算机的 SSH 密钥,我按照GitLab 的这些说明进行操作 - 添加 SSH 密钥。请注意,由于我使用的是 Win10,因此我必须在 Windows 上的 Git Bash 中执行所有这些命令(它在常规 DOS cmd Shell 中不起作用)。

然后再次在 Git Bash 中,我不得不做一个git clone我遇到问题的 repo,在我的情况下,我不得不将它克隆为不同的名称,因为我已经在本地拥有它并且不想丢失我的提交。例如

git clone ssh://git@gitServerUrl/myRepo.git myRepo2

然后我得到提示将其添加到已知主机列表中,问题可能是这个:

您确定要继续连接(是/否)?

我输入了“yes”,它终于成功了,你通常会收到类似这样的消息:

警告:将“[您的 repo 链接]”(ECDSA)永久添加到已知主机列表中。

注意:如果您在 Windows 上,请确保对所有命令都使用 Git Bash,这在常规 cmd shell 或 powershell 中不起作用,我真的必须在 Git Bash 中执行此操作。

最后,我删除了第二个克隆存储库(myRepo2在示例中)并返回到我的第一个存储库,我终于可以在我最喜欢的编辑器 VSCode 中像往常一样完成所有 Git 工作。

于 2018-01-21T21:18:10.487 回答
4

当远程服务器想要连接到私有仓库时,它将通过 ssh 进行身份验证。使用 ssh-keygen 创建私钥-公钥对,或者如果您已经拥有公钥-私钥。在私有仓库的设置中复制并粘贴公钥。

YourPrivateRepo -> 设置 -> 部署密钥 -> 添加部署密钥 -> 粘贴公钥。

现在远程服务器将能够连接到私有仓库。

注意:部署密钥只能读取 repo。需要明确允许写访问。

于 2019-07-18T11:31:57.830 回答
4

如果你在 Windows 上使用 git。

  • 打开 git GUI。
  • 在 git GUI 中打开本地 git 存储库。
  • 如果遥控器已经存在,则添加遥控器或推送。
  • 对是否要继续的问题回答“是”。

GUI 客户端会为您添加密钥到~/.ssh/known_hosts. 如果您不经常这样做,这更容易记住,也避免了使用 git 命令行的需要(标准的 Windows 命令行没有ssh-keyscan可执行文件。

于 2018-04-05T16:51:53.787 回答
3

这里提到的解决方案很棒,唯一缺少的一点是,如果您的公钥和私钥文件名与默认文件名不同怎么办?

在 ~/.ssh 下创建一个名为“config”的文件并添加以下内容

Host github.com
    IdentityFile ~/.ssh/github_id_rsa

替换github_id_rsa为您的私钥文件。

于 2020-07-19T18:57:40.827 回答
2

在图像公开时,我在构建期间在 DockerFile 中遇到了同样的错误。我对 Dockerfile 做了一点修改。

 RUN git clone  https://github.com/kacole2/express-node-mongo-skeleton.git /www/nodejs

这将是因为使用 git@github.com:... 语法最终 > 使用 SSH 进行克隆,并且在容器内,您的私钥不可用 >。您需要使用 RUN git clone > https://github.com/edenhill/librdkafka.git代替。

于 2018-07-30T13:16:29.300 回答
1

原因似乎是远程主机的公钥未存储或与存储的不同。(请注意安全问题,有关详细信息,请参阅 Greg Bacon 的回答。)

在这种情况下,我习惯于git clone提示我:

The authenticity of host 'host.net (10.0.0.42)' can't be established.
ECDSA key fingerprint is 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00.
Are you sure you want to continue connecting (yes/no)?

不确定,为什么会引发此错误。可能是您的 shell 或 git SSH 命令的配置。
无论如何,您可以通过运行获得相同的提示ssh user@host.net

于 2020-10-13T08:28:35.147 回答
1

另一种方法对我有用,而不是克隆 SSH 链接

git@gitlab.company.net:upendra/mycode.git

有一个选择http链接的选项

http://gitlab.company.net:8888/upendra/mycode.git

所以我使用http链接克隆Visual Studio,它对我有用

于 2021-04-14T17:39:00.960 回答
1

这意味着您的远程主机密钥已更改(可能是主机密码更改),

您的终端建议以 root 用户身份执行此命令

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]

您必须从您的电脑/服务器上的主机列表中删除该主机名。复制建议的命令并以 root 用户身份执行。

$ sudo su                                                        // Login as a root user

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]    // Terminal suggested command execute here
Host [www.website.net]:4231 found: line 16 type ECDSA
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

$ exit                                                           // Exist from root user

再试一次,希望这有效。

于 2016-08-14T05:02:16.703 回答
1

Check permissions on the known_hosts file as well - both the user's (~/.ssh/known_hosts) and the global one (/etc/ssh/ssh_known_hosts).

In my case the old host was in /etc/ssh/ssh_known_hosts. When I removed it as root with sudo ssh-keygen -f /etc/ssh/ssh_known_hosts -R THE_HOST it changed permissions on that file to 0600, so SSHing to THE_HOST as root worked, but for any other user it failed with "Host key verification failed". The fix was:

sudo chmod 644 /etc/ssh/ssh_known_hosts
于 2022-01-26T12:19:56.747 回答
1

推送到 Git 返回错误代码 403 致命:HTTP 请求失败

检查是否存在计费问题。Google Cloud 停止将文件上传到https://source.cloud.google.com/

付款问题解决后,我得到了这个问题。但没有改变钥匙。

谢谢

于 2021-06-11T14:06:18.797 回答
1

除了Tupy 的答案之外,您可能需要添加存储库主机的端口号:

ssh-keyscan -p 8888 -t rsa domain.com >> ~/.ssh/known_hosts

如果您有另一台可以远程访问的机器,您可以通过查看 ~/.ssh/known_hosts 找到端口号:

[user]$ less ~/.ssh/known_hosts
[domain.com]:8888,[000.00.000.000]:8888 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCi...
于 2021-04-15T23:59:43.017 回答
1

您可以使用 https 而不是 ssh 进行 git clone 或 git pull 或 git push

前任:

git clone https://github.com/user/repo.git
于 2020-08-09T23:27:27.250 回答
1

如果您没有使用 Windows Session 来更新代码,并且您使用PortableGit,则需要HOMEPATH在运行 git 命令之前设置环境变量。

这个例子更适合其他用例,但我认为这对这篇文章来说是一个很好的概念证明。

$env:HOMEPATH="\Users\Administrator";C:\path\to\PortableGit\bin\git.exe -C C:\path\to\repository.git pull'

于 2021-05-19T01:28:45.220 回答
0

对我来说,我只是将“known_hosts”文件重命名为“known_hosts.del”进行备份。然后重新运行 git clone xxx 并输入“yes”。我将创建新的“known_hosts”

于 2022-01-26T01:38:29.300 回答
0

您可以在 Jenkinsfile 或任何您想要的地方使用“https”URL 格式的“git url”。

git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'

于 2016-05-11T09:58:12.223 回答
0

或者,如果您使用的是MSYS2终端(在 Windows* 上)和密码,则可能是终端没有正确提示“输入密码”,从而拒绝访问 SSH。

如果您使用的是 Windows,则可以改为使用 Git Bash 或 Powershell 来获取提示并正确连接。(我目前正在寻找 MSYS 的解决方案。)

*不确定是否相关。

于 2021-09-26T11:21:04.853 回答
0

问题: 主机密钥验证失败。致命:无法从远程存储库中读取。

请确保您具有正确的访问权限并且存储库存在。

解决方案: 我检查了所有设置,还检查了 GitHub 中的关键设置。最后,我将 Git URL 从文件中更改"git@github.com:palvsv/travelo-moon.git"为文件中,它可以工作。"https://github.com/palvsv/travelo-moon.git".config"yourprojectdirectory/.git/config"

于 2021-10-08T08:56:04.730 回答
-3

我遇到了类似的问题,不幸的是我使用了 GitExtensions HMI 并忘记了我写了一个密码。使用 HMI.... 算了吧!生成密钥时不要输入密码!

于 2016-01-22T18:28:42.897 回答
-6

当我尝试git clone一个不属于我的仓库时,我收到了这条消息。解决方法是分叉然后克隆。

于 2018-04-27T01:00:47.413 回答