Python3.6, ftp_tls и повторное использование сессии

Итак, я пытаюсь загрузить файл на удаленный FTP-сервер, который требует повторного использования сеанса.

Я должен указать, что даже если я могу без проблем подключиться к серверу через Filezilla, я получаю ошибку "неизвестный сертификат сервера".

Это мой сценарий:

import ftplib
import ssl

USER = "username"
PASS = "password"
SERVER = "1.2.3.4"
PORT = 21
BINARY_STORE = True

filepath = '/path/to/myfile.txt'
filename = 'myfile.txt'

content = open(filepath, 'rb')
ftp = ftplib.FTP_TLS()
ftp.set_debuglevel(2)
print (ftp.connect(SERVER, PORT))
print (ftp.login(USER, PASS))
print (ftp.prot_p())
print (ftp.set_pasv(True))

print (ftp.cwd("testfolder"))
print (ftp.storbinary('STOR %s' % filename, content))
ftp.quit()

Но я получаю это сообщение: 450 TLS сеанс соединения для передачи данных не возобновлен или сеанс не соответствует контрольному соединению

Файл создан на сервере, но он пустой (размер 0 байт). Я прочитал дюжину постов и ясно понял, что должен реализовать повторное использование сессий и на стороне клиента - что поддерживается в Python 3.6 - но просто... я не Я не знаю, как это сделать, так как я не могу найти ни одного рабочего примера.

Кто-то предложил расширить класс FTP_TLS:

class MyFTP_TLS(ftplib.FTP_TLS):
    """Explicit FTPS, with shared TLS session"""
    def ntransfercmd(self, cmd, rest=None):
        conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest)
        if self._prot_p:
            session = self.sock.session
            if isinstance(self.sock, ssl.SSLSocket):
                    session = self.sock.session
            conn = self.context.wrap_socket(conn,
                                            server_hostname=self.host,
                                            session=session)  # this is the fix
        return conn, size
ftp = MyFTP_TLS()
...

Но теперь ответ сервера таков: у объекта 'SSLSocket' нет атрибута 'сессия'

Так что я застрял. Что мне не хватает?

1 ответ

Это работает для вас?

from ftplib import FTP_TLS

USER = "username"
PASS = "password"
SERVER = "1.2.3.4"
PORT = 21 

ftps = FTP_TLS(SERVER)
ftps.login(USER, PASS)         
ftps.prot_p()         
ftps.set_pasv(True)
Другие вопросы по тегам