如何使用paramiko有效地获取所有SSH服务器主机密钥?
到目前为止,我的尝试如下。首先获取所有键类型(返回一个字符串元组):
ssh_transport = paramiko.transport.Transport('%s:%s' % (ip_address, 22))
ssh_transport.start_client()
options = ssh_transport.get_security_options()
ssh_transport.close()
对于上述情况,这是一种较短的方法:
client_key_types = paramiko.transport.Transport._preferred_keys
接下来,遍历密钥类型,获取选项对象,分配目标密钥类型,启动客户端,并获取主机密钥:
for key_type in options.key_types:
ssh_transport = paramiko.transport.Transport('%s:%s' % (ip_address, 22))
inner_options = ssh_transport.get_security_options()
inner_options.key_types = (key_type,)
ssh_transport.start_client()
key = ssh_transport.get_remote_server_key()
ssh_transport.close()
在上面的代码中,如果尝试使用不受支持的密钥类型,则会出现异常。
该代码有效,但是用这种方法执行效率似乎非常低。
使用Paramiko内置的东西是否有更好的方法?最后,我只想在最少的基础结构上验证我的第一个连接上服务器的身份。
答案 0 :(得分:0)
要获取Paramiko支持的主机密钥类型列表而不打开连接,可以阅读Transport._preferred_keys
:
print(paramiko.transport.Transport._preferred_keys)
要获取服务器支持的主机密钥类型的列表,您必须解析Paramiko日志文件:
DEB [20190407-07:20:15.255] thr=1 paramiko.transport: kex algos:[...] server key:['ssh-rsa', 'ssh-dss'] client encrypt:[...] server encrypt:[...] client mac:[...] server mac:[...] client compress:[...] server compress:[...] client lang:[''] server lang:[''] kex follows?False