Python Paramiko-确定可用的密码和密钥交换算法

Python Paramiko-确定可用的密码和密钥交换算法,python,encryption,ssh,paramiko,Python,Encryption,Ssh,Paramiko,我有一个使用Paramiko库用Python编写的自动SFTP程序。如果建立连接,我可以显示传输使用的密码和密钥交换算法。然而,我不确定这是否与现有的算法和密码相同 例如: >>> import paramiko >>> ssh = paramiko.SSHClient() >>> ssh.load_system_host_keys() >>> ssh.set_missing_host_key_policy(paramiko

我有一个使用Paramiko库用Python编写的自动SFTP程序。如果建立连接,我可以显示传输使用的密码和密钥交换算法。然而,我不确定这是否与现有的算法和密码相同

例如:

>>> import paramiko
>>> ssh = paramiko.SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect("myhost.example.com", 22, username="xyzzy")
>>> t = ssh.get_transport()
>>> so = t.get_security_options()
>>> so.kex
('diffie-hellman-group14-sha1', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group1-sha1')
>>> so.ciphers
('aes128-ctr', 'aes256-ctr', 'aes128-cbc', 'blowfish-cbc', 'aes256-cbc', '3des-cbc', 'arcfour128', 'arcfour256')
这和现有的一样吗?如果没有,是否有办法通过编程确定可用的内容?

传输.get\u security\u options()返回的是:

包含ssh传输的安全首选项的简单对象。 这些是可接受的密码、摘要、密钥类型和密钥的元组 交换算法,按优先顺序列出

因此,它列出了Paramiko库支持的密码和kex算法(或您已配置/允许的子集)

这就是您(和Paramiko)为连接提供的内容

最后实际使用的是服务器也支持的最首选的cipher/kex算法(以您的术语提供)


要获取支持的算法列表,无需连接,您可以使用:

import paramiko
import socket

opts = paramiko.transport.Transport(socket.socket()).get_security_options()
print(opts.ciphers)
print(opts.kex)