Подключиться к явному FTPS (FTPES) с помощью Python (ошибка)
Я загружаю файл по ftp и продолжаю получать ошибку «ssl.SSLEOFError: EOF произошел с нарушением протокола (_ssl.c:2756)».
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
tp = MyFTP_TLS()
ftp.ssl_version = ssl.PROTOCOL_TLSv1_2
ftp.connect(server, 21)
ftp.set_pasv(True)
ftp.auth()
ftp.prot_p()
ftp.login(user, passwd)
print("Success connection")
ftp.set_debuglevel(2)
ftp.encoding = "utf-8"
#ftp.getwelcome()
with open(dest_filename,"rb") as file:
try:
ftp.storbinary(f"STOR {dest_filename}", file)
except:
ftp.quit()
os.remove(dest_filename)
ftp.quit()
os.remove(dest_filename)
Почему это выдает ошибку? Идеи?
1 ответ
Это код, который я в итоге использовал. Он расширяет класс ftp python. По сути, выполните ftp = MyFTP_TLS(), а затем выполните все необходимые вызовы, например, ftp.login(user,passwd) и т. д., как обычно.
`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:
conn = self.context.wrap_socket(conn,
server_hostname=self.host,
session=self.sock.session) # reuses TLS session
conn.__class__ = ReusedSslSocket # we should not close reused ssl socket when file transfers finish
return conn, size`