python ftplib和TLS,数据连接问题

时间:2019-03-27 10:21:18

标签: python python-3.x ssl ftplib

我需要连接到仅接受TLS连接的(可能配置错误的)FTP服务器。

我正在使用ftplib中的FTP_TLS。我可以连接,认证和列出文件。 尝试上传文件时,出现534错误。

我在lftp上也得到了相同的行为,但是在lftp中,可以使用以下标志解决此问题:

rails assets:precompile

在python中,我尝试过set ftp:ssl-protect-data true ,但是没有运气。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我已经找到了问题的原因:该服务器是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()