【问题标题】:Get all SSH host keys before connecting with paramiko在连接 paramiko 之前获取所有 SSH 主机密钥
【发布时间】: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

标签: python ssh paramiko


【解决方案1】:
  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
    

【讨论】:

  • _preferred_keys 属性是按照 Paramiko 认为正确的顺序,还是通常理解为正确的顺序?我应该使用ssh-ed25519 键而不是ssh-rsa,因为我同时控制客户端和服务器?
  • “Paramiko 认为是正确的,还是通常理解为正确的顺序?” -- 差不多,不是吗?
  • 我是 Paramiko 的新手,并且在一定程度上是公钥认证。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 2021-01-27
  • 2014-12-30
  • 2020-07-15
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
相关资源
最近更新 更多