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

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

有 3 个服务器:本地服务器、裸服务器、开发服务器。

以下工作流程非常有效:

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 上的 hooks/post-receive 文件中,我会得到一个

remote: Host key verification failed.

我可以通过 ssh 从 Development 连接到 Bare,没有任何问题,也不需要使用密码(在我设置了 RSA 对之后)。

即使我将 post-receive 钩子缩短到

ssh ip.of.Development.server

我遇到了同样的错误,但如果我在命令行上输入完全相同的行,它就可以正常工作。

答案1

在“裸”服务器内部,您应该编辑运行钩子的用户的 ~/.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 无法确认主机“destination (10.0.0.1)”的真实性。RSA 密钥指纹为 51:a4:73:ef:6d:b6:40:c1:a2:1f:ba:33:a0:64:c0:f8。您确定要继续连接吗(是/否)?是
警告:已将“destination”(RSA) 永久添加到已知主机列表中。

答案2

Pablo Montepagano 的回答是正确的——但是它非常具体,而且不一定深入探讨原因或一些外围的理解。

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

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

-----------------听说只有链接的答案会被反对,自我调节-------------

因此,我正在寻找一种平凡的方法来绕过克隆 git repo 的未知主机手动交互,如下所示:

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 的 git 以及一般与 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 对于某些事情非常有用,例如检测开放端口和手动验证 SSH 指纹。但是,回到我们正在做的事情上。

很好。我检查过的多个地方和机器要么受到了攻击,要么更合理的解释就是一切都很顺利。

那个“指纹”只是为了方便我们而用单向算法缩短的字符串,但存在多个字符串解析为相同指纹的风险。这种情况会发生,这被称为冲突。

无论如何,回到我们可以在下面的上下文中看到的原始字符串。

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

因此,我们有办法提前向原始宿主索取身份证明。

此时,我们手动操作与自动操作一样容易受到攻击 - 字符串匹配,我们拥有创建指纹的基础数据,并且我们可以在将来请求该基础数据(防止冲突)。

现在以一种防止询问主机真实性的方式使用该字符串......

在这种情况下,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==

第一个注释行令人恼火地出现了——但您可以通过“>”或“>>”约定使用简单的重定向来摆脱它。

由于我已尽力获取未受污染的数据以用于识别“主机”和信任,因此我将把此标识添加到我的 ~/.ssh 目录中的 known_hosts 文件中。由于现在它将被识别为已知主机,因此我不会收到上述提示,就像您还是个孩子时一样。

感谢您的支持,现在就开始吧。我正在添加 bitbucket RSA 密钥,以便我可以作为 CI 工作流的一部分以非交互方式与那里的 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 做同样的事情。

我看到很多 Stack Overflow 帖子都告诉你,要盲目地以编程方式添加密钥,而无需进行任何检查。你对不同网络上不同机器的密钥检查得越多,你就越能相信主机就是它所说的那个主机——这是你能从这一层安全中获得的最好结果。

错误的 ssh -oStrictHostKeyChecking=no 主机名 [命令]

错误的 ssh-keyscan -t rsa -H 主机名 >> ~/.ssh/known_hosts

请不要做上述任何一件事。您有机会增加避免有人通过中间人攻击窃听您的数据传输的机会——抓住这个机会。区别在于验证您拥有的 RSA 密钥是否是真正的服务器的密钥,现在您知道如何获取该信息来比较它们,以便您可以信任连接。只需记住,从不同的计算机和网络进行更多比较通常会增加您对连接的信任度。

相关内容