Skip to content

python ftplib SSLEOFERROR 解决方案

1 - 问题描述

使用 ftplib 库连接 FTP 服务器时,出现 SSLEOFERROR 错误。

2 - 问题原因

FTP 服务端配置上要求客户端复用 session,即控制 session 和数据传输 session 必须相同。

3 - 解决方案

python 3.6 即以上版本,可以通过以下代码解决(继承 ftplib.FTP_TLS 类,重载 ntransfercmd 方法)

python
class ReusedSslSocket(SSLSocket):
    def unwrap(self):
        pass


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

Released under the MIT License.