如何通过Paramiko使用SSH密钥和Pageant连接SFTP

11 投票
2 回答
30630 浏览
提问于 2025-04-18 17:53

我正在尝试通过Paramiko连接到一个SFTP,使用的是有密码保护的SSH密钥。我已经把密钥加载到Pageant中(我知道Paramiko是支持这个的),但是我无法解密我的私钥。

我找到一个例子,里面提到了allow_agent=True,但是这个参数似乎不能和SFTPClient一起使用。

有没有人能告诉我,Paramiko和Pageant能不能这样一起使用呢?

这是我目前的代码,运行时出现了PasswordRequiredException的错误。

privatekeyfile = 'path to key'
mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)
transport = paramiko.Transport(('host', 'port'))
transport.connect('username',pkey = mykey)
sftp = paramiko.SFTPClient.from_transport(transport)

2 个回答

0

这个对我有效


privatekeyfile = 'path to key'
mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)
ssh_client = paramiko.SSHClient()
ssh_client.load_system_host_keys()
ssh_client.connect(hostname='host', username='user', allow_agent=True, pkey=mykey)

ftp_client = ssh_client.open_sftp()

print(ftp_client.listdir('/'))
10

在使用RSAKey.from_private_key_file加载一个加密的密钥时,你需要提供一个密码短语。

不过要注意,当你使用Pageant时,其实你根本不需要加载密钥。这就是使用认证代理的意义所在。但只有SSHClient支持Pageant,而Transport类本身是不支持的。

你可以参考如何在Windows上使用Pageant和Paramiko?
不过因为allow_agent默认是True,所以其实代码并没有什么特别之处

一旦连接并认证成功,你可以使用SSHClient.open_sftp方法来获取你的SFTPClient实例。

ssh = paramiko.SSHClient()
ssh.connect(host, username='user', allow_agent=True)
sftp = ssh.open_sftp()

你还需要验证主机密钥:
Paramiko "未知服务器"

撰写回答