Неявный 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 здесь, и он работает как чемпион! Спасибо вам, эти три человека.