如何在pysftp及Paramiko中配置SSH-RSA相关公钥算法参数?
SSH/SFTP客户端算法配置问题解答
1. 在pysftp中配置HostKeyAlgorithms和PubkeyAcceptedKeyTypes
pysftp基于Paramiko实现,本身没有直接暴露SSH命令行的-o参数接口,但可以直接通过底层Paramiko的连接参数指定算法:
import pysftp # 建立SFTP连接时直接指定算法参数 with pysftp.Connection( hostname="ftp.acme.org", username="username", private_key="private_key.pem", port=22, # 对应 -o"HostKeyAlgorithms=+ssh-rsa",将ssh-rsa加入优先算法列表 hostkey_algorithms=["ssh-rsa"] + pysftp.paramiko.Transport._preferred_hostkey_algorithms, # 对应 -o"PubkeyAcceptedKeyTypes=+ssh-rsa" pubkey_accepted_key_types=["ssh-rsa"] + pysftp.paramiko.Transport._preferred_pubkey_algorithms ) as sftp: # 执行你的SFTP操作 print(sftp.listdir())
如果需要更精细控制Paramiko客户端,也可以先配置好Paramiko SSHClient再传给pysftp:
import pysftp import paramiko ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect( "ftp.acme.org", username="username", key_filename="private_key.pem", port=22, hostkey_algorithms=["ssh-rsa"] + paramiko.Transport._preferred_hostkey_algorithms, pubkey_accepted_key_types=["ssh-rsa"] + paramiko.Transport._preferred_pubkey_algorithms ) with pysftp.Connection(sshclient=ssh_client) as sftp: print(sftp.listdir())
2. 使用Paramiko实现等效的SFTP命令功能
Paramiko的SSHClient.connect方法直接支持指定算法参数,完全可以复现你给出的sftp命令效果,示例代码:
import paramiko from paramiko.sftp_client import SFTPClient # 初始化SSH客户端 ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器,对应命令中的所有参数 ssh_client.connect( hostname="ftp.acme.org", username="username", key_filename="private_key.pem", # 对应 -i private_key.pem port=22, # 对应 -P 22 # 对应 -o"HostKeyAlgorithms=+ssh-rsa" hostkey_algorithms=["ssh-rsa"] + paramiko.Transport._preferred_hostkey_algorithms, # 对应 -o"PubkeyAcceptedKeyTypes=+ssh-rsa" pubkey_accepted_key_types=["ssh-rsa"] + paramiko.Transport._preferred_pubkey_algorithms ) # 获取SFTP客户端并操作 sftp = SFTPClient.from_transport(ssh_client.get_transport()) # 示例:下载文件 sftp.get("remote_file.txt", "local_file.txt") # 清理连接 sftp.close() ssh_client.close()
说明
- 代码中用列表拼接
["ssh-rsa"] + 默认算法列表的方式,模拟了命令行中+ssh-rsa的效果——将ssh-rsa优先加入算法协商列表,而不是替换默认列表。 - 如果你需要仅使用ssh-rsa(而不是追加),直接传入
["ssh-rsa"]即可。
内容的提问来源于stack exchange,提问作者Natim
相关产品推荐
相关产品推荐

