SSH从脚本失败,在命令行上工作(Git)

有3台服务器:本地,裸机,开发。

以下工作stream程完美地工作:

1. Make my local changes 2. git push to Bare 3. ssh into Bare 4. $ ssh ip.of.Development.server "cd /path/to/Development/repo; git pull" 

这正是你所期望的,内容被拉到我的开发服务器,显示在页面上,一切都很好。

但是,如果我把最后一行移到我的Bare钩子/后接收文件上,我会得到一个

 remote: Host key verification failed. 

我可以从开发ssh ssh没有问题,并没有使用密码(我成立了一个RSA对后)。

即使我把post-receive钩子剪下来了

 ssh ip.of.Development.server 

我得到相同的错误,但如果我在命令行中input完全相同的行,它工作正常。

在“裸”服务器内,你应该编辑运行钩子的用户的〜/ .ssh / known_hosts文件。

〜/ .ssh / known_hosts行的示例:

 192.168.1.9 ssh-rsa AAAB3NzaC1yc2EAAAADAQABAAABAQDM5bg362+EqiRioaVO5f7L7a4NK94yHI6HXQCdge7WvmN9AFVhruXs31JUooxTD0tMe3nE0zDIt9fBcoIXNYjd2auCrRdT/2kvNg12aqhJpoxKeArekjQ10xmyjkDGQr6DUTzW7TOX55aucDbftO1chQ6+wG7mpvkE6N0J9HsQvJrjb3LO9JlEDCYFp2sSx3OxvCl33pEMk7zVhHftqP8hmZnQF8Y2/dO/nK/UawJVOVzyvImzvOhBFqKYgVIKajtjH/yodf9R1tOALqP9QQVBA9zJOLhc4q6Rcj3QVb+o6mv3Zl5QudZP6ATcFeKZPzEEUrqHbeQiZ2Ce72AUtD+7 

您应该删除标识您尝试连接的服务器的行,然后,在再次启动您的脚本之前,请向您的用户执行“ssh user @ destination”,以使目标服务器的主机密钥指向您的known_hosts文件。 喜欢这个:

localhost%ssh user @ destination无法build立主机“目标(10.0.0.1)”的真实性。 RSA密钥指纹是51:a4:73:ef:6d:b6:40:c1:a2:1f:ba:33:a0:64:c0:f8。 你确定要继续连接(是/否)吗? 是
警告:将“目标”(RSA)永久添加到已知主机的列表中。

帕伯罗·蒙特帕加诺(Pablo Montepagano)的回答是正确的 – 但这是非常具体的,并不一定要进入为什么或某些外围的理解。

在这里find一个不同的答案: https : //serverfault.com/questions/132970/can-i-automatically-add-a-new-host-to-known-hosts/807363#807363

(我讨厌人们把事情标记为重复的 – 这不是一个重复的问题,但是连接的答案适用于基于SSH的许多事情。)

—————–听到链接只有回答是皱眉,自我调节————-

所以,我正在寻找一种世俗的方式来绕过克隆git仓库的未知主机手动交互,如下所示:

 brad@computer:~$ git clone [email protected]:viperks/viperks-api.git Cloning into 'viperks-api'... The authenticity of host 'bitbucket.org (104.192.143.3)' 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)? 

请注意RSA密钥指纹…

所以,这是一个SSH的东西,这将适用于通过SSH的SSH和只是SSH相关的东西一般…

 brad@computer:~$ nmap bitbucket.org --script ssh-hostkey Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-05 10:21 EDT Nmap scan report for bitbucket.org (104.192.143.3) Host is up (0.032s latency). Other addresses for bitbucket.org (not scanned): 104.192.143.2 104.192.143.1 2401:1d80:1010::150 Not shown: 997 filtered ports PORT STATE SERVICE 22/tcp open ssh | ssh-hostkey: | 1024 35:ee:d7:b8:ef:d7:79:e2:c6:43:9e:ab:40:6f:50:74 (DSA) |_ 2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40 (RSA) 80/tcp open http 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 42.42 seconds 

首先,在你的日常驱动上安装nmap。 nmap对于某些事情非常有帮助,比如检测开放端口和手动validationSSH指纹。 但是,回到我们正在做的。

好。 我要么在多个地方和我检查过的机器上妥协 – 要么就是发生了什么事情,对于一切正在发生的事情的更合理的解释。

这个“指纹”只是一个string缩短了一个单向algorithm,为了我们的人类方便,可能有多个string分解成相同的指纹。 碰巧,他们被称为碰撞。

无论如何,回到我们可以在下文中看到的原始string。

 brad@computer:~$ ssh-keyscan bitbucket.org # bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128 no hostkey alg # bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-129 bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw== # bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-123 no hostkey alg 

所以,提前一点,我们有办法从原来的东道主请求一种身份certificate。

在这一点上,我们手动的就像自动化一样脆弱 – string匹配,我们有创build指纹的基础数据,我们可以在将来要求这些基础数据(防止碰撞)。

现在,以防止询问主机真实性的方式使用该string…

在这种情况下known_hosts文件不使用明文条目。 当你看到它们的时候,你会知道散列条目,它们看起来像散列随机字符而不是xyz.com或123.45.67.89。

 brad@computer:~$ ssh-keyscan -t rsa -H bitbucket.org # bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128 |1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw== 

第一条评论线令人愤慨地显示出来 – 但你可以通过“>”或“>>”惯例的简单redirect来摆脱它。

由于我已经尽了最大的努力来获取未被识别的数据来识别“主机”和信任,我将把这个标识添加到我的〜/ .ssh目录下的known_hosts文件中。 既然现在会被认定为已知的东道主,那么当你还是个年轻人的时候,我就不会得到上述的提示。

感谢你的支持,在这里,你走了。 我添加了bitbucket RSA密钥,这样我就可以作为CI工作stream程的一部分,以非交互方式与我的git存储库进行交互,但是无论你做什么都可以。

 #!/bin/bash cp ~/.ssh/known_hosts ~/.ssh/known_hosts.old && echo "|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==" >> ~/.ssh/known_hosts 

所以,这就是你今天如何保持处女。 你可以按照你自己的时间遵循类似的方向,对github做同样的事情。

我看到这么多的堆栈溢出post告诉你以编程方式盲目地添encryption钥没有任何forms的检查。 你从不同networking上的不同机器上检查密钥的次数越多,你就越能相信主机就是它所说的 – 而且这是你从这个安全层所能得到的最好结果。

错误 ssh -oStrictHostKeyChecking = no hostname [command]

错误 ssh-keyscan -t rsa -H hostname >>〜/ .ssh / known_hosts

请不要做上面的任何一件事。 您有机会通过中间人的攻击来增加避免窃听您的数据传输的机会 – 请抓住机会。 不同的是,从字面上validation您拥有的RSA密钥是真正的服务器之一,现在您知道如何获取这些信息来比较它们,因此您可以信任该连接。 只要记住,来自不同计算机和networking的更多比较通常会增加您信任连接的能力。