Неявный FTPS для ShareFile завершается ошибкой с "тайм-аутом операции" в Python

При использовании Python для подключения к ShareFile через неявную FTPS я получаю следующее:

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 (обязательный, потому что неявный FTPS не поддерживается напрямую в ftplib) приходит отсюда: проблема неявного TLS-соединения с Python FTP. Вот код:

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. Это лучший / единственный вариант?

Загрузка ShareFile с тайм-аутом кода Python 2.7.5 на FTPS STOR

ftplib - создание файла очень медленное: SSLError: Тайм-аут операции чтения

ftps.storlines socket.timeout, несмотря на завершение загрузки файла

Существует также старая дискуссия по этому вопросу на python.org: http://bugs.python.org/issue8108. Существует предположение, что это неоднозначная ситуация, которую трудно исправить (и, возможно, никогда не было?)

Пожалуйста, обратите внимание: я бы добавил комментарии к существующим вопросам, но моя репутация была недостаточно высока, чтобы комментировать (новый пользователь обмена стека).

2 ответа

Иногда вам нужна помощь.

Чтобы исправить это, не изменяя напрямую код ftplib (который требует перескоков через Mac, потому что вы не можете легко писать / изменять файлы в вашей /System/Library), я переопределил метод storbinary в ftplib.FTP_TLS. По сути, это исправление для поддержки неявного FTPS:

Неявная проблема с TLS-соединением в Python FTP

затем добавьте эти строки в класс 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()

Моя проблема с неявным ftp через TLS беспокоила меня в течение шести месяцев. На этой неделе я решил, что пришло время это исправить. Наконец, я объединил код Джорджа Лесли-Ваксмана и gaFF здесь и Manager_of_it здесь, и он работает как чемпион! Спасибо вам, эти три человека.

Другие вопросы по тегам