FTP 没有连接,最后是 "EOFError"

FTP doesn't connect ends up with "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 '' Traceback (most recent call last): File "FTP.py", line 12, in ftps.connect('IP', port) File "C:_data\learn\Miniconda\lib\ftplib.py", line 155, in connect self.welcome = self.getresp() File "C:_data\learn\Miniconda\lib\ftplib.py", line 236, in getresp resp = self.getmultiline() File "C:_data\learn\Miniconda\lib\ftplib.py", line 222, in getmultiline line = self.getline() File "C:_data\learn\Miniconda\lib\ftplib.py", line 210, in getline raise EOFError EOFError

我不确定这个错误的原因是什么。我可以使用与 FTP 客户端 (FileZilla) 相同的详细信息连接到 ftp 服务器。任何人都可以指出我的代码是否存在问题以及解决此问题的可能选项。

编辑 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 明确弹出一个证书,我在桌面上按“确定”,然后建立连接。我假设这里的失败是因为我的代码不接受证书。任何帮助表示赞赏。

对于任何寻求答案的人来说,问题是隐式 FTPS 连接需要套接字进行 ssl 包装 automatically.I 使用了以下由 George Leslie-Waksman

编写的代码
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

如果这解决了您的问题,请为原始答案点赞 -->