python ftplib和TLS,数据连接问题

2024-06-12 10:40:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要连接到一个(可能配置错误)FTP服务器,它只接受TLS连接。在

我在用ftplib的FTP。我可以连接、验证和列出文件。 当我试图上传文件时,我得到了一个534错误。在

我在lftp中得到了同样的行为,但是在lftp中,我可以用这个标志来解决这个问题:

set ftp:ssl-protect-data true

在python中,我尝试过FTP_TLS.prot_p(),但没有运气。在

有什么建议吗?在


Tags: 文件服务器truessldata标志错误tls
1条回答
网友
1楼 · 发布于 2024-06-12 10:40:29

我找到了问题的原因:服务器是一个IIS服务器,ftplib似乎与ISS有一些问题,或者可能是IIS有一些ftplib没有处理的“特殊需求”。在

我必须子类FTP_TLS类并重写storbinary方法:

class iisFTP_TLS(ftplib.FTP_TLS):
    ssl_version=ssl.PROTOCOL_TLS
    def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None):
        """Store a file in binary mode.  A new port is created for you.

        Args:
        cmd: A STOR command.
        fp: A file-like object with a read(num_bytes) method.
        blocksize: The maximum data size to read from fp and send over
            the connection at once.  [default: 8192]
        callback: An optional single parameter callable that is called on
            each block of data after it is sent.  [default: None]
        rest: Passed to transfercmd().  [default: None]

        Returns:
        The response code.
        """
        self.voidcmd('TYPE I')
        with self.transfercmd(cmd, rest) as conn:
            while 1:
                buf = fp.read(blocksize)
                if not buf:
                    break
                conn.sendall(buf)
                if callback:
                    callback(buf)
            ## shutdown ssl layer
            #if _SSLSocket is not None and isinstance(conn, _SSLSocket):
            #   conn.unwrap()
        return self.voidresp()

相关问题 更多 >