python - paramiko:打开和返回 sftp 连接的方法

标签 python ssh sftp paramiko

我想编写一个方法,该方法接受 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 仍然存在,但底层连接现在已断开。

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

编辑:我修改了返回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()

关于python - paramiko:打开和返回 sftp 连接的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37172488/

相关文章:

bash - 如何在 SFTP 执行结束时执行 shell 脚本?

linux - 如何将图像转换为低宽度 200

python - 属性错误 : 'str' object has no attribute 'public_blob'

当年份是两位数时,python从字符串中断转换日期

python - .extend() 方法返回 'None' 而不是我打算返回的所需列表组合

ruby-on-rails - 加速 ruby​​ ssh 握手

java - 将文件上传到只能通过另一个 SSH/SFTP 服务器访问的 SFTP 服务器

java - 如何使用 Java JSch 库暂停 SFTP 上传?

python - 从 ESA Sentinel-2 产品在 python 中加载 RGB 图像并使用 openCV 保存

python - 如何为我的 py2exe 发行版创建 list 文件?