1

我在stackoverflow的其他地方找到了这段代码:

if [ -z "`ssh-keygen -F ${wPCS_IP}`" ]; then  
  ssh-keyscan -p ${wPCS_PT} -H ${wPCS_IP} >> ~/.ssh/known_hosts
fi

我在使用代码时有两个问题:

  1. 即使成功,此代码也会生成错误 ($?=1)。

  2. 如果我在添加 known_hosts 后再次运行 ssh-keygen -F ${wPCS_IP} ,即使它们刚刚添加,它也不会在 known_hosts 中找到密钥。这是更大的问题。

本地机器是 Ubuntu Server 16.04 LTS,远程机器是 Ubuntu Server 14.04 LTS。

我的代码和我发现的代码示例之间的主要区别是我使用了端口选项 -p。

另外,我注意到 known_hosts 文件没有按名称或 IP 地址列出机器。这与我的 Gentoo 笔记本电脑不同。

4

2 回答 2

2

所以事实证明,当 ssh 有备用端口时,它会以这种格式作为 IP 地址的一部分存储在 known_hosts 文件中:

[${WPCS_IP}]:WPCS_PT

这意味着要使 if 语句起作用,它需要如下所示:

if ! ssh-keygen -F "[${wPCS_IP}]:${WPCS_PT}" -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${wPCS_PT} ${wPCS-IP} >> ~/.ssh/known_hosts; fi

感谢 alvits 让我朝着正确的方向前进……

更新:事实证明 Ubuntu 16.04 加密了远程主机的 IP 地址(但不是端口)。我仍在试图弄清楚如何适应这种差异。

另一个更新:事实证明 -H 选项是失败的。一旦你散列了密钥,它就再也找不到了。这适用于 Ubuntu 14.04:

if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi

可以看到第一个 if 语句生成 keyscan 数据,而第二个没有,因为 keyscan 数据是正确的,但是如果添加 -H,keygen 不会检测到散列键条目...

但是,要在 Ubuntu 16.04 上获得类似的命令,必须更改 if:

if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8
if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi

在这种情况下 known_hosts 文件必须包含端口...

-H 也在这里。如果使用 -H 生成,if 将找不到密钥。

令人沮丧的是,行为因版本而异,最安全的散列版本不起作用。

另一个编辑:当远程服务器在 sshd_config 中使用非标准端口时,可能是在 known_hosts 中指定的端口。这可能是预期的行为。

于 2017-01-28T17:47:43.057 回答
1

我向 open-ssh 列表发送了一封电子邮件,并提出了一些很好的建议。基本上,依赖 ssh-keygen -F 和 ssh-keyscan -H 是不好的,因为文件格式和位置往往因系统而异。

我今天将实施的真正解决方案是为每个服务器生成证书,以便它们相互识别。这对我很有效,因为我可以完全控制两台服务器。

我得到了一个链接,解释了如何设置服务器证书:

https://blog.habets.se/2011/07/OpenSSH-certificates.html

这是专门针对 Ubuntu 的链接。 https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with-ubuntu

如果这是我的最后一次更新,假设这对我有用。

于 2017-01-30T17:36:02.693 回答