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

我使用以下格式的命令:

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

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

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

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


当前回答

对Tupy的回答做一个小小的补充,您可能需要添加存储库主机的端口号:

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

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

[user]$ less ~/.ssh/known_hosts
[domain.example]:8888,[000.00.000.000]:8888 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCi...

其他回答

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

mknod -m 666 /dev/tty c 5 0

原因似乎是远程主机的公钥没有存储或与存储的公钥不同。(注意安全问题,详见Greg Bacon的回答。)

在这种情况下,我习惯了git克隆提示:

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得到相同的提示。

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

域的主机密钥。例子变了。如果这对您来说不可疑,可以通过编辑${HOME}/从本地缓存中删除旧密钥。Ssh /known_hosts删除域行。示例或让SSH实用程序为您完成

ssh-keygen -R domain.example

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

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

或者,等效地,下次当你连接git fetch、git pull或git push(甚至是一个普通的SSH域。示例)时,让SSH在提示时回答yes

The authenticity of host 'domain.example (a.b.c.d)' can't be established.
RSA key fingerprint is XX:XX:...:XX.
Are you sure you want to continue connecting (yes/no)?

提示的原因是域。Example在删除后不再在您的known_hosts中,并且可能不在系统的/etc/ssh/ssh_known_hosts中,因此SSH无法知道连接另一端的主机是否真的是domain.example。(如果错误的密钥在/etc中,具有管理权限的人将必须更新系统范围内的文件。)

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

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

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

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

注意:部署键仅具有读取repo的访问权限。需要显式地允许写访问。

如果你正在使用git for Windows。

打开git GUI。 在git GUI中打开本地git存储库。 添加远程或推送(如果远程已经存在)。 对于你是否想继续的问题,回答“是”。

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