我想以非交互方式克隆回购。 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 ...
yes yes | git clone ...
,但它不起作用。
编辑:这是一个解决scheme: 我可以自动添加一个新的主机到known_hosts? (用ssh-keyscan把known_hosts添加进去)。
我不认为这是最好的解决scheme,但这对我来说是一个解决scheme。
回答:
使用ssh-keyscan
命令将域名添加到known_hosts
文件解决了这个问题:
ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts
没有一个答案是安全的。 你有2个选项:
它不会要求你提供指纹,因为不涉及ssh,而是使用https(duh)。 如果您使用极简主义镜像或Docker,则可能需要安装ca-certificates包。
你真的需要在运行时添encryption钥吗? 这完全不安全。
在运行脚本之前,从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克隆之前。
GitHub公钥只有在他们认为已经被攻破(或者不够安全)的情况下才会改变。 如果这种情况发生,你希望你的脚本失败。
虽然我当然明白,你想自动化这样一个过程,这样做是不明智的。 在使用安全协议时,SSH和相关networking子组件的原因是为了警告人类系统的公钥是未知的。 这是有意的 – 用户需要明确告知系统主机是预期的。 您不希望自动接受呈现给您的每个公钥或SSH中的部分安全性,否则TLS / SSL可能会受到影响。 一个例子就是通过中间人攻击,比如当一个代理软件将自己的密钥提交给你期望的主机时。
谨慎行事。
如果你不用担心networking代码的来源,那么你应该在克隆的时候明确地使用git://协议 – 它是无证的,并且是明文forms的。
我相信这里更好的select是备份并清空~/.ssh/known_hosts
文件,手动执行SSH连接,validationIP地址和指纹, mv ~/.ssh/known_hosts ~/bitbucket_hosts
,然后使用~/bitbucket_hosts
,以自动将已知指纹附加到known_hosts文件(不要忘记恢复原来的~/.ssh/known_hosts
)。
这个步骤只需要执行一次(我相信在任何机器上),一旦你有了指纹,你可以把它合并到你的自动化脚本中。
正如杰夫·霍尔所说,这样做是危险的,因为它允许未被发现的中间人攻击。 但是,您可以在ssh中使用StrictHostKeyChecking no
选项来禁用检查主机密钥。 不过,如果我是你的话,我会非常小心的。
编辑 :不起作用!
在特定的克隆上对RSA指纹检查暂时回答“是”?
yes | git clone http://bitbucket.org...
编辑:testing现在在git 1.9.3的Fedora 19上失败:
$ yes | git clone [email protected]:freakypie/django-csv-tool.git Cloning into 'django-csv-tool'... The authenticity of host 'bitbucket.org (131.103.20.168)' 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)?
将键添加到.ssh/known_hosts
似乎是正确的做法。
虽然当你自动执行任务时,你要确保密钥没有被包含并添加到每个clone
/ pull
任务上。
这个片段只会添加指纹,如果尚未find:
if [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ]; then ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null; fi