paramiko:打开并返回 sftp 连接的方法

2023-12-19

我想编写一个方法,它接受 IP、用户名和密码,并返回到该服务器的开放 SFTP 连接。这是我使用的代码paramiko:

def open_sftp_connection(ip, user, passwd):
    ssh = SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, 22, user, passwd)
    assert ssh.get_transport().is_active(), 'Failed to connect to server'

    sftp = ssh.open_sftp()
    return sftp

如果我直接在 python shell 中执行此代码,它可以正常工作:

>>> ssh = SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect(ip, 22, user, passwd)
>>> assert ssh.get_transport().is_active(), 'Failed to connect to server'
>>> sftp = ssh.open_sftp()
>>> print sftp.get_channel().get_transport().is_active()
True

但是当我将它放入一个函数并调用该函数时,sftp 连接会断开:

>>> def open_sftp_connection(ip, user, passwd):
...     ssh = SSHClient()
...     ssh.load_system_host_keys()
...     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
...     ssh.connect(ip, 22, user, passwd)
...     assert ssh.get_transport().is_active(), 'Failed to connect to server'
...     sftp = ssh.open_sftp()
...     return sftp
...
>>> sftp = open_sftp_connection(ip, user, passwd)
>>> print sftp.get_channel().get_transport().is_active()
False

我唯一能想到的是 ssh 连接存储在本地ssh,那么当函数返回时,ssh被垃圾收集,并且连接被终止,所以虽然SFTPClient仍然存在,底层连接现已失效。

如果是这样的话,我该如何解决呢?如果不是,到底发生了什么?

EDIT: 我修改了函数返回sftp, ssh现在连接保持打开状态。所以罪魁祸首就是垃圾收集器。可以在不返回两个值的情况下解决这个问题吗?


您需要访问 ssh 和 sftp 实例。

def open_sftp_connection(ip, user, passwd):
    ssh = SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, 22, user, passwd)
    assert ssh.get_transport().is_active(), 'Failed to connect to server'
    return ssh, ssh.open_sftp()

ssh, sftp = open_sftp_connection(ip, user, passwd)
print sftp.get_channel().get_transport().is_active()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

paramiko:打开并返回 sftp 连接的方法 的相关文章

随机推荐