Python FTP_をリロードTLS実装Implicit FTP Over TLS方式ダウンロードファイル

6125 ワード

Python 2について7で言えば、内蔵のFTP_TLSクラスでは、Implicit FTP Over TLS暗号化方式のFTP Server操作はサポートされていません.Implicit FTP Over TLS暗号化方式をサポートするためには、内蔵のFTP_をリロードする必要があります.TLSクラス、具体的なコードは以下の通りです.
import ftplib

class FTP_TLS(ftplib.FTP_TLS):
    def __init__(self, host='', user='', passwd='', acct='', keyfile=None, certfile=None, timeout=180):
        ftplib.FTP_TLS.__init__(self, host, user, passwd, acct, keyfile, certfile, timeout)
    def connect(self, host='', port=0, timeout=-999):
        if host != '':
            self.host = host
        if port > 0:
            self.port = port
        if timeout != -999:
            self.timeout = timeout

        try:
            self.sock = socket.create_connection((self.host, self.port), self.timeout)
            self.af = self.sock.family
            self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile, ssl_version=ssl.PROTOCOL_TLSv1)
            self.file = self.sock.makefile('rb')
            self.welcome = self.getresp()
        except Exception as e:
            print e
        return self.welcome
    def download(self, remote_file_name, local_file_name):
        with open(local_file_name, 'wb') as fp:
            self.retrbinary('RETR %s' % remote_file_name, fp.write)

ダウンロードされたサンプルコードは次のとおりです.
    host = 'XXX'
    port = 2222
    user = 'user'
    password = 'pass'
    local_dir = './data'

    ftp = FTP_TLS()
    ftp.connect(host, port)
    LOG.debug('begin to login')
    ftp.login(user, password)
    LOG.debug('login succeed')
    LOG.debug('welcome info = %s', ftp.getwelcome())
    ftp.prot_p()

    ftp.cwd('/crexbatch')
    ftp.download('People.zip', 'People.zip')
    ftp.retrlines('LIST')
    fnames = ftp.nlst()
    open('crexbatch.txt', 'wb').write('\r
'.join(fnames))