FTP не подключается, заканчивается ошибкой EOFError

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

from ftplib import FTP_TLS
from ftplib import FTP
import ssl
import ftplib


FTP_TLS.ssl_version = ssl.PROTOCOL_TLSv1_2
ftps = FTP_TLS(timeout=100)    
ftps.set_debuglevel(2)     
ftps.connect('IP', port)
ftps.auth()
ftps.prot_p()
ftps.login('username', 'password')

Программа пытается какое-то время, прежде чем произойдет сбой со следующей ошибкой:

get '' Трассировка (последний последний вызов): Файл "FTP.py", строка 12, в ftps.connect('IP', порт) Файл "C:_data\learn\Miniconda\lib \ftplib.py", строка 155, в файле connect self.welcome = self.getresp() "C:_data\learn\Miniconda\lib\ftplib.py", строка 236, в файле getresp resp = self.getmultiline() "C:_data\learn\Miniconda\lib\ftplib.py", строка 222, в getmultiline строка = self.getline() Файл "C:_data\learn\Miniconda\lib\ftplib.py", строка 210, в getline поднять EOFError EOFError

Я не уверен, в чем причина этой ошибки. Я могу подключиться к ftp-серверу, используя те же данные с FTP-клиентом (FileZilla). Может ли кто-нибудь указать, есть ли проблема с моим кодом и возможные варианты ее устранения.

Изменить 1

Как предлагается ниже, публикуя журналы FileZilla:

Status:   Connecting to IP:Port...
Status:   Connection established, initializing TLS...
Status:   Verifying certificate...
Status:   TLS connection established, waiting for welcome message...
Status:   Logged in
Status:   Retrieving directory listing...
Status:   Directory listing of "/" successful

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


person misguided    schedule 29.04.2019    source источник
comment
Вы запускаете FileZilla на той же машине, что и ваш код Python? Покажите нам его лог-файл.   -  person Martin Prikryl    schedule 29.04.2019
comment
Обновлено, как было предложено.   -  person misguided    schedule 30.04.2019
comment
@MartinPrikryl спасибо за ваше предложение. Я начал смотреть на другую перспективу, как только подробно рассмотрел файл FileZilla.   -  person misguided    schedule 30.04.2019


Ответы (1)


Для тех, кто ищет ответ, проблема заключалась в том, что неявные соединения FTPS требуют, чтобы сокет был автоматически обернут ssl. Я использовал приведенный ниже фрагмент кода, написанный Джордж Лесли-Ваксман

import ftplib
import ssl

class ImplicitFTP_TLS(ftplib.FTP_TLS):
    """FTP_TLS subclass that automatically wraps sockets in SSL to support implicit FTPS."""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._sock = None

    @property
    def sock(self):
        """Return the socket."""
        return self._sock

    @sock.setter
    def sock(self, value):
        """When modifying the socket, ensure that it is ssl wrapped."""
        if value is not None and not isinstance(value, ssl.SSLSocket):
            value = self.context.wrap_socket(value)
        self._sock = value

Если это решит вашу проблему, проголосуйте за исходный ответ -->https://stackoverflow.com/a/36049814/392233

person misguided    schedule 30.04.2019