python ftplib и TLS, проблемы с подключением к данным - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно подключиться к (возможно, неправильно настроенному) FTP-серверу, который принимает только соединения TLS.

Я использую FTP_TLS из ftplib. Я могу подключиться, проверить подлинность и список файлов. Когда я пытаюсь загрузить файлы, я получаю сообщение об ошибке 534.

Я получаю то же самое поведение с lftp, но в lftp я могу обойти эту проблему с этим флагом:

set ftp:ssl-protect-data true

В питоне я пробовал FTP_TLS.prot_p(), но без удачи.

Есть предложения?

1 Ответ

1 голос
/ 27 марта 2019

Я нашел причину проблемы: сервер является сервером 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()

...