所以事實證明,當有對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