2016-09-16 86 views
2

此代碼可以幫助我建立一個shh連接。我知道當在known_hosts中找不到密鑰時set_missing_host_key_policy有幫助。但它的行爲不像實際的ssh,因爲在第一次運行此代碼後,我認爲host_key將被添加到known_hosts,並且我不必再具有set_missing_host_key_policy()功能。但是,我錯了(paramiko.ssh_exception.SSHException)。我如何使用paramikohost_key永久添加到known_hosts? (由於後端代碼的某一部分是用「C」,它需要host_keyknown_hosts被發現)Paramiko:將host_key永久添加到known_hosts中

還是我誤解的東西?我需要在此方面的指導...

import paramiko 

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(hostname=str(host),username =str(user),password=str(pswd)) 

回答

3

從包文檔,比較

client.load_system_host_keys(filename=None) 

Load host keys from a system (read-only) file. Host keys read with 
this method will not be saved back by `save_host_keys`. 

client.load_host_keys(filename) 

Load host keys from a local host-key file. Host keys read with this 
method will be checked after keys loaded via `load_system_host_keys`, 
but will be saved back by `save_host_keys` (so they can be modified). 
The missing host key policy `.AutoAddPolicy` adds keys to this set and 
saves them, when connecting to a previously-unknown server. 

因此,爲了使的paramiko存儲任何新主機密鑰,您需要使用load_host_keys,而不是load_system_host_keys。例如。

client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 

它通常是一個好主意,避免使用AutoAddPolicy,因爲它讓你開到人在這方面的中間人攻擊。我落得這樣做是在同一文件夾中的腳本生成本地known_hosts

ssh -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=./known_hosts [email protected] 

,然後加載該文件,而不是:

client.load_host_keys(os.path.join(os.path.dirname(__file__), 'known_hosts')) 

這樣我可以一起分發known_hosts我腳本並在不同機器上運行它,而不會觸及這些機器上的實際known_hosts。

+0

謝謝你......非常有幫助! – nidHi

+0

如果使用'ssh'生成'known_hosts',它基本上與使用'AutoAddPolicy'生成它一樣(當然,我的意思是如果你自己生成它,然後用腳本分發它)。 +1 –