2

当使用 Python 通过隐式 FTPS 连接到 ShareFile 时,我得到以下信息:

Traceback (most recent call last):
    ftps.storbinary("STOR /file, open(file, "rb"), 1024)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ftplib.py", line 769, in storbinary
conn.unwrap()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 791, in unwrap
    s = self._sslobj.shutdown()
SSLError: ('The read operation timed out',)

我的 tyFTP(必需,因为 ftplib 不直接支持隐式 FTPS)类来自这里:Python FTP 隐式 TLS 连接问题。这是代码:

ftps = tyFTP()
try:
  ftps.connect(‘ftps.host.domain’, 990)
except:
  traceback.print_exc()
  traceback.print_stack()
ftps.login(‘uid', ‘pwd')
ftps.prot_p()

try:
  ftps.storbinary("STOR /file", open(file, "rb"), 1024)
  # i also tried non-binary, but that didn't work either
  # ftps.storlines("STOR /file", open(file, "r"))
except:
  traceback.print_exc()
  traceback.print_stack()

之前有人问过这个问题,但提供的唯一解决方案是破解 python 代码。这是最好/唯一的选择吗?

在 FTPS STOR 上使用 Python 2.7.5 代码超时上传 ShareFile

ftplib - 文件创建速度非常慢:SSLError:读取操作超时

ftps.storlines socket.timeout 尽管文件上传完成

在 python.org 上也有关于这个问题的旧讨论:http: //bugs.python.org/issue8108。那里的建议是,这是一个难以解决的模棱两可的情况(也许从来没有?)

请注意:我会为现有问题添加评论,但我的声誉不足以发表评论(新堆栈交换用户)。

4

2 回答 2

1

有时你需要的帮助是你自己的。

为了在不直接修改 ftplib 代码的情况下解决此问题(这需要在 Mac 上跳过障碍,因为您无法轻松地在 /System/Library 中写入/修改文件),我覆盖了 ftplib.FTP_TLS 中的 storbinary 方法。这本质上是使用此修复程序来支持隐式 FTPS:

Python FTP隐式TLS连接问题

然后将这些行添加到类 tyFTP,并注释掉 conn.unwrap() 调用,并将其替换为“pass”:

  def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None):
    self.voidcmd('TYPE I')
    conn = self.transfercmd(cmd, rest)
    try:
      while 1:
        buf = fp.read(blocksize)
        if not buf: break
        conn.sendall(buf)
        if callback: callback(buf)
      if isinstance(conn, ssl.SSLSocket):
        pass
#         conn.unwrap()
    finally:
      conn.close()
    return self.voidresp()
于 2017-01-12T14:53:27.510 回答
0

我在 TLS 上的隐式 ftp 问题困扰了我六个月。本周,我决定是时候修复它了。最后,我在这里结合了 George Leslie-Waksman 和 gaFF 的代码,以及这里的 Manager_of_it,它的工作原理非常棒!谢谢这三个人。

于 2022-01-20T19:55:31.153 回答