【问题标题】:FTP doesn't connect ends up with "EOFError" [duplicate]FTP 未连接以“EOFError”结束 [重复]
【发布时间】:2019-04-29 06:32:10
【问题描述】:

我正在尝试连接以连接到 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')

程序在失败之前尝试了一段时间,并出现以下错误:

得到 '' Traceback(最近一次调用最后一次):文件“FTP.py”,第 12 行,在 ftps.connect('IP', port) 文件“C:_data\learn\Miniconda\lib\ftplib.py”,第 155 行,在连接中 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 line = self.getline() 文件“C:_data\learn\Miniconda\lib\ftplib.py”,第 210 行,在 getline 引发 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 显式弹出一个证书,我在我的桌面上按 OK,然后建立连接。我假设这里的失败是因为我的代码不接受证书。任何帮助表示赞赏。

【问题讨论】:

  • 您是否在与 Python 代码相同的机器上运行 FileZilla?向我们展示它的日志文件。
  • 已按建议更新。
  • @MartinPrikryl 感谢您的建议。详细查看 FileZilla 文件后,我开始从不同的角度看待问题

标签: python-3.x ftp ftps


【解决方案1】:

对于任何寻找答案的人来说,问题在于隐式 FTPS 连接需要自动对套接字进行 ssl 包装。我使用了以下由 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

如果这解决了您的问题,请支持原始答案 -->https://stackoverflow.com/a/36049814/392233

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2021-12-02
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多