Paramiko:打开并返回SFTP连接的方法

3

我希望编写一个方法,接收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被垃圾回收,连接被终止,因此尽管SFTPClient仍然存在,但底层连接已经死亡。
如果是这种情况,我该如何解决呢?如果不是,请问实际发生了什么?
编辑:我修改了函数以返回sftp, ssh,现在连接保持开启。因此,罪魁祸首是垃圾回收器。是否可以在不返回两个值的情况下解决这个问题?

如果你怀疑垃圾回收是罪魁祸首,尝试返回“ssh,sftp”,看看是否能保持其活动状态。 - user590028
1个回答

2
您需要访问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()

这可以在不实际返回两个值的情况下完成吗? - ewok
是的,但你需要在函数外打开SFTP连接... ssh = open_sftp_connection(ip, user, passwd) sftp = ssh.open_sftp() - ToddJCrane
一个只接受IP、用户名和密码作为输入,然后返回已经打开的SFTP连接的单一函数是不可能实现的吗? - ewok
1
据我所知,是的。 - ToddJCrane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接