与paramiko连接之前获取所有SSH主机密钥

时间:2019-04-06 23:30:52

标签: python ssh paramiko

如何使用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内置的东西是否有更好的方法?最后,我只想在最少的基础结构上验证我的第一个连接上服务器的身份。

1 个答案:

答案 0 :(得分:0)

  1. 要获取Paramiko支持的主机密钥类型列表而不打开连接,可以阅读Transport._preferred_keys

    print(paramiko.transport.Transport._preferred_keys)
    
  2. 要获取服务器支持的主机密钥类型的列表,您必须解析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