题 非交互式git clone(ssh指纹提示)[重复]


这个问题在这里已有答案:

我想以非交互方式克隆回购。克隆时,git要求确认主机的指纹:

The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? no

每次出现这些问题时,我如何强制“是”?我试过用 yes yes | git clone ...,但它不起作用。

编辑: 这是一个解决方案: 我可以自动将新主机添加到known_hosts吗? (使用ssh-keyscan为known_hosts添加entires)。


109
2017-11-09 09:04




有趣的是,即使两年后这个问题也没有得到正确答案。还有一些其他情况下git会提示,例如,如果你尝试克隆http并且服务器要求basic_auth。如何在非互动模式下执行此操作? - sorin
添加 -q 选项(安静)为我做了。现在我卡住自动化密码。


答案:


我不认为这是最好的解决方案,但它对我来说是一个解决方案。

回答:

将域名添加到 known_hosts 文件使用 ssh-keyscan 命令解决了这个问题:

ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts


92
2017-11-02 04:13



请不要这样做。这完全不安全:指纹不是为了惹恼你,而是为了确保你没有面对中间人攻击。请参阅下面的答案。 - autra
正如我所说,“我不认为这是最好的解决方案,但对我来说是一个解决方案。”因为我匆忙,肯定有“policataly正确的方式”这样做((: - kroe
这不是政治上正确的问题:-)这是一个关于它是否安全的问题。当且仅当您手动检查指纹后,您的解决方案才是安全的 ssh-keyscan 并在添加之前 .ssh/known_hosts 与github在其网站上发布的一样。你可以用几种方式做到,我的就是其中之一。您也可以在脚本中进行相同的检查,但最后一切都是这样:您需要脚本知道它所期望的指纹,如果它没有收到正确的指纹,您需要它失败。 - autra
仅在不存在时添加密钥 ssh-keygen -F github.com || ssh-keyscan github.com >>~/.ssh/known_hosts - transang
作为配置管理或配置运行的一部分执行此操作应该没问题。如果指纹将来发生变化,那么ssh将按预期工作,并提醒您证书已更改,返回非0退出代码。这可能会阻止您使用ssh或git的任何脚本。 - emhohensee


答案都不安全。你有2个选择:

使用https协议而不是git

它不会要求您提供指纹,因为不涉及ssh,而是使用https(duh)。如果您使用的是极简主义图像或Docker,则可能需要安装ca-certificates包。

如果你真的想要git + ssh协议

你真的需要在运行时添加密钥吗?这完全不安全。

在运行脚本之前,从github(在本地计算机上)获取密钥:

ssh-keyscan github.com >> githubKey

生成指纹:

ssh-keygen -lf githubKey

并检查它 手动 针对那些列出的 在这个页面 (好吧,你相信https证书和OpenSSL为你带来了原始的github网站,但它仍然比盲目接受公钥更好)。

然后,通过添加它在脚本中对其进行编码:

echo '<copy paste the content of 'cat githubKey' on your machine>'  >> ~/.ssh/known_hosts

在git clone之前。

GitHub公钥只有在他们认为已被泄露(或不够安全)时才会改变。如果是这种情况,那么你  你的脚本无论如何都要失败。


79
2018-06-25 15:39



这个 是这个问题的唯一正确和安全的答案。它为什么是最后一个?我为人性感到羞耻;-( - Jan Warchoł
如果您使用双因素身份验证,则无法使用GitHub执行非交互式HTTPS。 - Brett Widmeier
我不明白为什么不。我们在这里谈论公共回购,不需要身份验证。从脚本克隆私有仓库完全是另一回事:您需要授权您的脚本执行此操作。 - autra
在现代探险家的“搜索栏”的帮助下,“手动”检查指纹不如听起来那么痛苦(例如 铬)。 - Franklin Yu


我相信这里更好的选择是备份和清空你的 ~/.ssh/known_hosts 文件,手动执行SSH连接,验证IP地址和指纹, mv ~/.ssh/known_hosts ~/bitbucket_hosts,然后使用的内容 ~/bitbucket_hosts在您的脚本中自动将已知指纹附加到known_hosts文件(不要忘记恢复原始文件 ~/.ssh/known_hosts)。

此步骤只需执行一次(在任何机器上,我相信),一旦有了指纹,就可以将其合并到自动化脚本中。


7
2018-04-07 18:53





虽然我当然明白你想要自动化这样一个过程,但这样做是不明智的。 SSH和相关网络子组件在使用安全协议时发生故障的原因是为了警告人类系统的公钥未知。这是故意的 - 用户需要明确地通知系统主机是预期的。您不希望自动接受呈现给您的每个公钥或SSH或TLS / SSL中的部分安全性可能会受到损害。一个例子是通过中间人攻击,例如代理软件在您期望的主机位置提供自己的密钥时。

谨慎行事。

如果您不必担心跨线程的代码来源,那么在克隆时您应该明确地并且专门使用git://协议 - 它是无需身份验证的,并且是明文的。


6
2018-01-22 22:34



我可以明确地看到我们需要强制执行非交互式使用的用例 git clone......这并不意味着我们要求接受任何检查(特别是指纹)。就我而言,我很高兴自动失败。 - vaab


正如杰夫霍尔所说,这样做是危险的,因为它允许未被发现的中间人攻击。但是,你可以使用 StrictHostKeyChecking no ssh中的选项禁用检查主机密钥。但是,如果我是你,我会非常小心这个选项。


5
2018-02-03 07:45



它还允许中间人权利吗? - autra


将密钥添加到 .ssh/known_hosts 似乎是正确的做法。

虽然当您自动执行任务时,您希望确保密钥尚未包含并添加到每个密钥上 clone/pull 任务。

此代码段仅添加指纹(如果尚未找到):

if [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ]; then ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null; fi

4
2018-02-16 10:42



这很完美。可以轻松放入部署脚本,比禁用主机验证更安全。这是github的单线程: if [ ! -n "$(grep "^github.com " ~/.ssh/known_hosts)" ]; then ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null; fi; ssh-agent bash -c "ssh-add /path/to/your/deploy/id_rsa; git clone -b master git@github.com:githubAccount/githubRepo.git /your/target/dir - tweak2
这不起作用 HashKnownHosts 已启用 的/ etc / SSH / ssh_config中 (要么 的〜/ .ssh /配置)。代替 [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ] 它会更好用 [ ! "$(ssh-keygen -F bitbucket.org)" ],找到散列和非散列行 的known_hosts。 - Claus Conrad