重载Python FTP_TLS 实现Implicit FTP Over TLS方式下载文件

对于Python2.7来讲,内置的FTP_TLS类并不支持Implicit FTP Over TLS加密方式的FTP Server操做,为支持Implicit FTP Over TLS加密方式,必须重载内置的FTP_TLS类,具体代码以下:socket

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\n'.join(fnames))
相关文章
相关标签/搜索