所以事实证明,当 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 中指定的端口。这可能是预期的行为。