2016-09-16 89 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 –