【问题标题】:How to sftp using Paramiko Transport class using key?如何使用密钥使用 Paramiko Transport 类进行 sftp?
【发布时间】:2021-04-27 14:49:57
【问题描述】:

与其他合作伙伴一起,我们可以轻松获得连接密码。这是我们目前使用密码通过代理合作伙伴的 SFTP 服务器连接的代码:

import paramiko

proxy_command = '/usr/bin/ssh ' + proxy_address + ' -p 22 /usr/bin/nc ' + host_address + ' ' + str(host_port)
proxy = paramiko.ProxyCommand(proxy_command)
transport = paramiko.transport.Transport(proxy)
transport.connect(username=username, password=password)
sftp = paramiko.sftp_client.SFTPClient.from_transport(transport)

我们的最新合作伙伴不会与我们共享密码 - 连接应仅依靠密钥。我们如何修改上述内容以实现代理上的密钥而不依赖于使用密码连接到主机?

【问题讨论】:

    标签: python proxy sftp paramiko


    【解决方案1】:

    如果您要求使用具有 Paramiko 低级 Transport 类的密钥进行身份验证,只需使用 Transport.connect 方法的 pkey 参数即可:

    pkey = paramiko.RSAKey.from_private_key_file(filename)
    
    transport.connect(username=username, pkey=pkey)
    

    虽然一般来说,您应该改用高级 SSHClient 类:

    ssh = paramiko.SSHClient()
    pkey = paramiko.RSAKey.from_private_key_file('id_rsa')
    ssh.connect(hostname=host_address, sock=sock, username=username, pkey=key)
    sftp = ssh.open_sftp()
    

    尽管事实证明,您希望使用存储在代理/跳转服务器上的密钥进行身份验证。您不能从本地服务器上运行的 Paramiko 代码使用存储在代理服务器上的密钥。您必须从代理服务器进行连接。或者将密钥下载到本地机器。或者只是将运行时的密钥从服务器读取到本地内存(什么是下载形式)。另见Executing command from remote server into another remote server using Paramiko

    【讨论】:

    • 这些信息帮助我了解了理想的配置并让我们开始运行。谢谢!