我想以非交互方式克隆一个仓库。克隆时,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)。
答案1
我不认为这是最好的解决方案,但对我来说这是一个解决方案。
回答:
known_hosts
使用以下命令将域名添加到文件ssh-keyscan
解决了该问题:
ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts
答案2
“StrictHostKeyChecking no”和“ssh-keyscan”选项都不安全。你需要如果您坚持使用 ssh,则需要在某些时候进行手动指纹验证以避免 MiTM 攻击。
实际上,您有两个选择:
使用 https 协议代替 git
它不会要求您提供指纹,因为不涉及 ssh,而是使用 https。从安全角度来看,您信任安装在操作系统上的根证书。如果您使用的是极简映像或 Docker,则可能需要安装 ca-certificates 包。
如果你确实想要 git+ssh 协议
您真的需要在运行时添加密钥吗?这并不安全,因为您没有检查指纹,这会让您容易受到 MiTM 攻击。这不仅仅是理论上的,而且已被证明是有效的。
在运行脚本之前,从 github(在本地机器上)获取密钥:
ssh-keyscan github.com > githubKey
生成指纹:
ssh-keygen -lf githubKey
并检查手动针对所列人员在此页面(好的,您信任 https 证书和 OpenSSL 为您带来原始 github 网站,但这仍然比盲目接受公钥要好得多)。
或者(信任相同的 https 和 OpenSSL),您可以从中获取https://api.github.com/meta像这样:curl -s https://api.github.com/meta | jq ."ssh_key_fingerprints" | grep RSA
。(谢谢@willscripted对于这个)
然后,在脚本中通过添加以下内容对其进行硬编码:
echo '<copy paste the content of 'cat githubKey' on your machine>' >> ~/.ssh/known_hosts
在 git clone 之前。
GitHub 公钥只有在他们认为它被泄露(或不够安全)时才会更改。如果是这种情况,你想你的脚本无论如何都会失败。
答案3
添加密钥.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
虽然我当然明白您想自动化这样的过程,但这样做是不明智的。SSH 和相关网络子组件在使用安全协议时犹豫不决的原因是警告人类系统的公钥未知。这是故意的 - 用户需要明确告知系统所需的主机。您不会希望自动接受向您提供的每个公钥,否则 SSH 或 TLS/SSL 中的部分安全性可能会受到损害。一个例子是通过中间人攻击,例如当代理软件在您期望的主机的位置提供自己的密钥时。
请谨慎行事。
如果您不担心网络上的代码来源,那么在克隆时您应该明确且专门地使用 git:// 协议 - 它无需身份验证并且以明文形式传输。