与其他合作伙伴一起,我们可以轻松获得连接密码。这是我们目前使用密码通过代理合作伙伴的 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)
我们最新的合作伙伴不会与我们共享密码——连接应仅依赖于密钥。我们如何修改上述内容以在代理上实现密钥而不依赖于使用密码连接到主机?
如果您要求使用 Paramiko 低级
Transport
类的密钥进行身份验证,只需使用 pkey
方法的 Transport.connect
参数即可:
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 代码使用存储在代理服务器上的密钥。您必须从代理服务器进行连接。或者将密钥下载到本地计算机。或者只是在运行时将密钥从服务器读取到本地内存(这是下载的一种形式)。另请参阅使用 Paramiko 将命令从远程服务器执行到另一个远程服务器。