2017-01-28 79 views
1

我在其他地方發現這個代碼在計算器:SSH密鑰,但凱基-F不工作

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筆記本電腦不同。

+0

試着告訴'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

+0

感謝您的回覆。我完全按照原樣使用了你的命令,併產生了相同的結果。它添加了known_hosts所需的行,但是當再次運行時,它不會檢測known_hosts文件中的主機並再次生成它們。 – Raydude

+0

在Ubuntu 16.04服務器上,known_hosts文件列出了遠程機器的端口號。我想知道是否需要爲ssh-keygen -F指定端口嗎? – Raydude

回答

1

所以事實證明,當有對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使用非標準端口。這可能是一種預期的行爲。