设置Paramiko模块的sftp.get()时间限制

2024-05-14

我正在使用 Paramiko 的 SFTP 客户端将文件从远程服务器下载到客户端(即获取操作)
要传输的文件有点大~1GB。
所以我希望如果时间超过10秒,get操作就会超时。

但是设置连接的超时值不起作用,它似乎只是创建 SSH 连接的超时,而不是整个 ssh 连接的超时。

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=username, password=password, timeout=10.0)
sftp = ssh.open_sftp()
start_time = time.time()
sftp.get(local_path,remote_path)
elapsed_time = time.time()-start_time
print elapsed_time
sftp.close()

我也尝试设置通道的超时值,但它也不起作用

sftp.get_channel.settimeout(10.0)

但这个超时又只是针对读/写操作

有一个类似的问题paramiko 中的超时(python) https://stackoverflow.com/questions/9758432/timeout-in-paramiko-python/40221590#40221590但它只对创建 SSH 连接超时有答案


更新1:根据@Martin的评论,我实现了一个回调函数,用于检查sftp的get操作的时间限制:

import paramiko
import time

Class TimeLimitExceeded(Exception):
    pass

timelimit = 10
start_time = time.time()

def _timer():
    elapsed_time = time.time()-start_time
    if elapsed_time > timelimit:
        raise TimeLimitExceeded

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=username, password=password, timeout=10.0)
sftp = ssh.open_sftp()
try:
    sftp.get(local_path,remote_path,_timer)
except TimeLimitExceeded:
    print "The operation took too much time to complete"
sftp.close()

但是排除异常的时间很多,代码在某个地方阻塞了。 我深入研究了 Paramiko 源代码,发现其背后的罪魁祸首是_close(self,async=False)的方法sftp_file.py有什么帮助解决这个问题吗?


更新 2:如果超过时间限制,则尝试关闭通道本身。 然后异常被刷新到控制台prefetch由单独的守护线程实现

 File "/scratch/divjaisw/python2.7/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/scratch/divjaisw/python2.7/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/scratch/divjaisw/python_virtual/lib/python2.7/site-packages/paramiko/sftp_file.py", line 488, in _prefetch_thread
    num = self.sftp._async_request(self, CMD_READ, self.handle, long(offset), int(length))
  File "/scratch/divjaisw/python_virtual/lib/python2.7/site-packages/paramiko/sftp_client.py", line 754, in _async_request
    self._send_packet(t, msg)
  File "/scratch/divjaisw/python_virtual/lib/python2.7/site-packages/paramiko/sftp.py", line 170, in _send_packet
    self._write_all(out)
  File "/scratch/divjaisw/python_virtual/lib/python2.7/site-packages/paramiko/sftp.py", line 133, in _write_all
    n = self.sock.send(out)
  File "/scratch/divjaisw/python_virtual/lib/python2.7/site-packages/paramiko/channel.py", line 715, in send
    return self._send(s, m)
  File "/scratch/divjaisw/python_virtual/lib/python2.7/site-packages/paramiko/channel.py", line 1081, in _send
    raise socket.error('Socket is closed')
error: Socket is closed

您要求的并不是真正的超时。术语“超时”用于等待响应的限制。

但您的服务器不会停止响应。沟通活跃。


您所要求的是对操作持续时间的限制。您很难指望这会很容易为您实现。这是一个比较具体的要求。你必须自己实现它。

您可以使用callback的论点get method https://docs.paramiko.org/en/latest/api/sftp.html#paramiko.sftp_client.SFTPClient.get:

def get(self, remotepath, localpath, callback=None):

在回调中,检查传输的持续时间,如果超过时间限制,则抛出异常。

有关示例,请参见如何在Python中使用信号模块或其他模块使Paramiko sftp.put()超时? https://stackoverflow.com/q/58844902/850848#58844904

这不会立即取消转移。为了优化传输性能,Paramiko 将最多 100 个读取请求排队到服务器(请参阅条件在sftp_file._write https://github.com/paramiko/paramiko/blob/2.7/paramiko/sftp_file.py#L204)。一旦您尝试取消传输,Paramiko 必须等待(最多 100 个)对这些请求的响应才能清除队列。

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

设置Paramiko模块的sftp.get()时间限制 的相关文章

随机推荐

  • 为什么我的 Facebook 访问令牌突然停止工作? “OAuthException:验证访问令牌时出错。”

    我有一个 iframe Facebook 应用程序 它使用 Facebook PHP SDK 进行身份验证并进行 api 调用 在身份验证过程中 系统会提示用户输入基本信息和离线访问 如果他们允许我的应用程序访问 Facebook 会将它们
  • 如何在php中正确显示另一种语言的mysql表数据

    我有一个 mySQL 表 其中一列中的数据采用英语以外的语言 波斯语 当我在表中输入数据时 它会正确显示 但是当我想在 php 文件中显示数据时 它会显示如下 好吧 我应该怎么做才能以正确的形式显示数据 由于我经常使用 非英语 字符 因此要
  • StreamBlock StreamField 中的 content_panels

    我定义了一些自定义 StreamField 块 我希望该选项能够折叠自定义块中的某些属性 就像我可以使用 content panels 对标准页面模型所做的那样 但我不认为这是受支持的 正确的 如果不为管理页面编写一些自定义 css js
  • C++ POD 类型有 RTTI 吗?

    据我了解RTTI是如何在各种C 编译器 例如GCC 中实现的 指向type info数据存储在vtable各班级的数据 也正如提到的here https stackoverflow com questions 1963926 when is
  • 如何实现 JsDoc 多重继承或 mixins?

    如何记录 mixin 或多重继承 class Parent function Parent Parent prototype parentTest 5 class Mixin function Mixin Mixin prototype m
  • 有关 window.history.pushState 的帮助

    我需要语法方面的帮助 我的网站使用 AJAX 在 board div 中加载博客文章 然后单击 close 将其关闭 当我加载帖子时 网址变成这样http www visualise ca anne au cherry http www v
  • Flutter Firebase 身份验证 currentUser() 返回 null

    这是关于 Flutter Firebase 身份验证插件的 我试图在创建新用户后发送验证电子邮件 但 sendEmailVerification 内部使用 currentUser 这对我来说似乎是一个错误 但为了以防万一 我在 stacko
  • jQuery beforeunload 自定义弹出窗口用于离开页面

    您好 我想自定义离开页面的弹出窗口 有什么简单的方法可以做到这一点吗 我正在使用简单的 jQuery document ready function var myPopUp pop up css display block window b
  • 在 Java 中实现 Mixin? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 使用Java 6 我如何实现mixin https en wikipedia org wiki Mixin 在 Ruby 中这非常简单
  • 如何在 Metro Windows 8 中查找应用栏的图标? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 如何在 Metro Windows 8 中查找应用栏的图标 我如何添加自定义图标 默认的应用程序栏样式使用 Segoe UI Symbol 字体作为其
  • 如何将模糊屏幕设置为整页并在点击页面时转到顶部

    CSS1 有效 parentDisable z index 2000 width 100 height 100 display none position absolute left 0 background url images btra
  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • python + selenium webdriver:使用身份验证方法

    我正在使用 python selenium webdriver 来自动化检查 我被困在通过弹出窗口请求 http 身份验证的网站上 我试图通过以下代码使用 身份验证 方法 init driver webdriver Firefox driv
  • 如何制作像 Google+ 应用程序中那样的气泡? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁知道如何使用 Google An
  • 如何将 HTML 表格导出为 .xlsx 文件

    我有一个关于导出的问题HTML表格 as an xlsx文件 我做了一些工作 现在我可以将其导出为xls 但我需要将其导出为xlsx 这是我的 jsFiddle https jsfiddle net 272406sv 1 https jsf
  • C++类名冲突

    我现在正在做一个项目 需要整合两个子项目 项目A是用C 编写的 项目B是用C编写的 一个问题是 在项目B中 有一个名为vector它是由其作者创建的 在项目 A 中 std vector in STL用来 因为项目B以后可能会更新 所以我不
  • Qt Creator:在终端中运行

    我想获得在 Qt Creator 中运行程序的完整控制台功能 与此处描述的问题相同 使用 Qt Creator 进行控制台输入 https stackoverflow com questions 1356328 console input
  • 如何在 Firebase Firestore 中使用多个 orderBy 查询进行排序?

    如果我想根据这种情况对文档进行排序 选择有库存的产品 通过检查名为 count 的字段 指定产品的总件数 根据另一个称为 价格 的字段对元素进行排序 看起来很简单 只需使用这段代码 DBRef collection col where co
  • 如何获取 cElementTree 中某个元素的所有文本子元素?

    我正在使用cElementTreePython 中的模块用于获取某个文本的子级XML树 使用text财产 但它似乎只适用于直接文本子项 见下文 python gt gt gt import xml etree cElementTree as
  • 设置Paramiko模块的sftp.get()时间限制

    我正在使用 Paramiko 的 SFTP 客户端将文件从远程服务器下载到客户端 即获取操作 要传输的文件有点大 1GB 所以我希望如果时间超过10秒 get操作就会超时 但是设置连接的超时值不起作用 它似乎只是创建 SSH 连接的超时 而