所以事实证明,当有对SSH备用端口,它存储在known_hosts文件在此格式的IP地址的一部分:
[${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密型ts远程主机的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
你可以看到,第一,如果语句生成键扫描数据,并且因为键扫描的数据是正确的第二个没有,但如果你添加-H,凯基没有检测散列键条目...
但是,要获得类似的命令在Ubuntu 16.04的工作,如果有改变:
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将不会找到该密钥。
令人沮丧的是,行为因版本而异,最安全的散列版本不起作用。
又一编辑:这可能是在known_hosts中被指定的端口时在远程服务器中的sshd_config使用非标准端口。这可能是一种预期的行为。
试着告诉'ssh-keygen'这个'known_hosts'文件在哪里。更好的方法是,如果! ssh-keygen -F $ {wPCS_IP} -f〜/ .ssh/known_hosts>/dev/null 2>&1;那么ssh-keyscan -p $ {wPCS_PT} $ {wPCS-IP} >>〜/ .ssh/known_hosts; fi'。 – alvits
感谢您的回复。我完全按照原样使用了你的命令,并产生了相同的结果。它添加了known_hosts所需的行,但是当再次运行时,它不会检测known_hosts文件中的主机并再次生成它们。 – Raydude
在Ubuntu 16.04服务器上,known_hosts文件列出了远程机器的端口号。我想知道是否需要为ssh-keygen -F指定端口吗? – Raydude