【发布时间】:2019-04-08 02:25:53
【问题描述】:
如何使用 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
接下来,遍历key类型,获取option对象,分配目标key类型,启动客户端,获取主机key:
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 内置的东西来做到这一点?最后,我只是尝试在第一次连接时验证服务器的身份,所需的基础设施最少。
【问题讨论】:
-
不幸的是answer is no。
-
你为什么要这样做?
-
@MartinPrikryl 好吧,它可能被误导了,但我希望存储服务器上支持的所有算法的密钥(或我想的指纹)。这样我就可以在使用我拥有的任何其他受支持的密钥之前识别服务器。最后,我想我希望对谈判施加控制,但也许这不是正确的做法。这一切又回到了我关于自动验证服务器密钥的整个过程的另一个问题。
-
我并不是说它是写的,但是 Windows 的 Bitvise SSH 客户端似乎获得了几个服务器密钥,但也许这只是在完成连接之后?我愿意接受任何学习机会。
-
连接中始终只涉及一种主机密钥类型。看起来你有XY problem。