Git错误:连接到远程存储库时"主机密钥验证失败"

boo*_*tsz 174 git ssh ssh-keys

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

我使用以下格式的命令:

git clone ssh://username@domain.com/repository.git
Run Code Online (Sandbox Code Playgroud)

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

主机密钥验证失败.

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

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

小智 273

正如我先前在克隆中回答的那样,git repo导致错误 - 主机密钥验证失败.致命:远程端意外挂断,将GitHub添加到授权主机列表中:

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

  • 这应该是公认的答案.谢谢你救了我的一天. (7认同)
  • 这是最安全的方式,缺少已经存在的密钥.假设您只运行一次,而不是每次连接到服务器. (3认同)
  • 你不知道你的答案可以挽救多少年的挫败感。它还修复了github桌面的身份验证错误。我也需要尝试一下我的流感 XD (3认同)
  • 也为我工作,我想知道为什么我不能克隆我自己的仓库 (2认同)
  • 如果您使用的是 Windows,最简单的方法是安装 git-for-windows(download) 并打开 Git Bash 。在此控制台中,您可以使用 ssh-keyscan 命令 (2认同)

Gre*_*con 114

您正在通过SSH协议进行连接.使用SSH,每个主机都有一个密钥.客户端记住与特定地址关联的主机密钥,如果主机密钥似乎发生更改,则拒绝连接.这可以防止人在中间发作.

domain.com的主机密钥已更改.如果这对您来说似乎不合适,您可以使用从本地缓存中删除旧密钥

ssh-keygen -R domain.com
Run Code Online (Sandbox Code Playgroud)

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

  • “您确定要继续连接吗(是/否)?”。不要犯和我一样的错误。您需要输入“是”。默认情况下,只需按 Enter 键不会选择“是” (10认同)
  • 有趣的是,运行“sudo ssh-keygen -R domain.com”可以将现有的“known_hosts”文件重命名为“known_hosts.old”,并创建一个仅可由 root 读取的副本。(`-rw----- root root`) 您可以轻松地将其`chown`回适当的用户,但您也可能会浪费一个下午的时间来调试 git 损坏的原因。:D (6认同)
  • 一个问题是您可能需要远程存储库的端口号: `ssh-keyscan -p 8888 -t rsa domain.com >> ~/.ssh/known_hosts` (5认同)
  • 对于 CI 环境(例如 Jenkins),当出现提示时您无法回答“是”。因此,请确保: 1. 您已正确创建 ssh 密钥,并将其保存在您家中的 .ssh 目录中。2. 将目标域添加到known_hosts,如此处所述。 (3认同)
  • @AndrewRueckert 随机添加“sudo”到命令开头是一个坏主意的众多原因之一。 (3认同)
  • @AndrewRueckert,你不知道这对我有多大帮助,我正在使用的 dockerfile 在使用 root 用户时对known_hosts 进行操作,这导致了各种各样的麻烦。谢谢! (2认同)

Sar*_*ran 40

我有类似的问题,但是,使用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. id_rsa.pub密钥添加到GitHub配置文件上的SSH密钥列表中.

  • @OJFord仅供参考:我已经编辑了原始答案,使您的评论变得过时。老实说,恕我直言,这首先并不完全正确。如果“~/.ssh”目录不存在,“touch”命令将失败,因此仍然需要步骤 1。另外,在使用“>>”重定向之前,您不需要“触摸”文件。如果需要的话将会创建它(但只是文件,而不是整个路径,所以仍然需要`mkdir -p`)。如果目录已经存在,则“-p”选项使其起作用。 (2认同)
  • Github 文档中关于添加新 ssh 密钥的内容中缺少#2 `ssh-keyscan`。 (2认同)
  • 我的“Dockerfile”缺乏权限,出现问题。在这里添加第二步解决了这个问题!感谢您所做的出色工作 (2认同)

Pow*_*ham 31

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

系统将提示您将github添加到已知主机.如果没有发生这种情况,您可以ssh -T git@github.com再次运行以接收提示.

  • 如果您从未收到提示,这是正确的答案。 (3认同)

Muh*_*kur 23

当终端显示:

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

不要我重复一遍,不要直接按下Enter

您必须首先在终端中输入 ,然后按。yesEnter


Cod*_*ice 12

对我来说,我只需要在提示符下键入"是",询问"你确定要继续连接(是/否)?" 而不是只按Enter键.

  • 哇,过去一个小时我一直在这个问题上,这解决了它。谢谢你! (3认同)
  • 这个答案让我意识到我必须在构建服务器上手动克隆我的存储库,以便输入“yes”并将我的 bitbucket 服务器添加到我的known_hosts (2认同)
  • @Sashah如果您需要的只是known_hosts中的bitbucket服务器,您可以手动编辑该文件。如果这是这样做的唯一原因,则无需克隆存储库。 (2认同)

Geo*_*roy 7

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

mknod -m 666 /dev/tty c 5 0
Run Code Online (Sandbox Code Playgroud)

  • 它对我有用,因为 /dev/tty 是作为文件创建的,非常奇怪!(所以你必须删除它然后用 mknod 重新创建它) (2认同)

小智 7

当被问到:

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

输入yes作为响应

这就是我如何解决我的问题。但是,如果您尝试只按回车键,则行不通!


sun*_*nil 6

如果您在办公室Intranet(否则是危险的)总是受防火墙保护,只需在〜/ .ssh/config中包含以下行

Host*
StrictHostKeyChecking no
UserKnownHostsFile =/dev/null

  • 我们没有企业防火墙,这仍然很危险.你怎么知道你在没有验证服务器密钥的情况下与真正的github交谈? (2认同)
  • 在企业环境中,大多数使用本地 git 存储库,而不是开源的。最坏的情况下,文件顶部的 .ssh 配置可以有 github 显式主机相关配置行,以便 ssh 选择更具体的匹配。 (2认同)

ghi*_*ing 6

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

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

git clone ssh://git@gitServerUrl/myRepo.git myRepo2
Run Code Online (Sandbox Code Playgroud)

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

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

我输入了“是”,它终于奏效了,您通常应该会收到类似于以下内容的消息:

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

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

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


San*_*ndy 6

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

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

现在远程服务器将能够连接到私人存储库。

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


Jul*_*ght 5

如果您使用 Windows 版 git。

  • 打开 git 图形用户界面。
  • 在 git GUI 中打开本地 git 存储库。
  • 添加遥控器或推送(如果遥控器已存在)。
  • 对于是否要继续的问题回答“是”。

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