You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:55:24