设为首页 收藏本站
查看: 1086|回复: 0

[经验分享] python ftp

[复制链接]

尚未签到

发表于 2018-8-10 08:18:45 | 显示全部楼层 |阅读模式
# !/usr/bin/env python  
# coding:utf-8
  
from ftplib import FTP
  
import os, sys, string, datetime, time
  
import socket
  

  

  
class MYFTP:
  
    def __init__(self, hostaddr, username, password, remotedir, port=21):
  
        self.hostaddr = hostaddr
  
        self.username = username
  
        self.password = password
  
        self.remotedir = remotedir
  
        self.port = port
  
        self.ftp = FTP()
  
        self.file_list = []
  
        # self.ftp.set_debuglevel(2)
  

  
    def __del__(self):
  
        self.ftp.close()
  
        # self.ftp.set_debuglevel(0)
  

  
    def login(self):
  
        ftp = self.ftp
  
        try:
  
            timeout = 60
  
            socket.setdefaulttimeout(timeout)
  
            ftp.set_pasv(True)
  
            print '开始连接到 %s' % (self.hostaddr)
  
            ftp.connect(self.hostaddr, self.port)
  
            print '成功连接到 %s' % (self.hostaddr)
  
            print '开始登录到 %s' % (self.hostaddr)
  
            ftp.login(self.username, self.password)
  
            print '成功登录到 %s' % (self.hostaddr)
  
            debug_print(ftp.getwelcome())
  
        except Exception:
  
            deal_error("连接或登录失败")
  
        try:
  
            print "now:",self.ftp.pwd()
  
            self.ftp.cwd(self.remotedir)
  
        except(Exception):
  
            deal_error('切换目录失败')
  

  
    def is_same_size(self, localfile, remotefile):
  
        try:
  
            remotefile_size = self.ftp.size(remotefile)
  
        except:
  
            remotefile_size = -1
  
        try:
  
            localfile_size = os.path.getsize(localfile)
  
        except:
  
            localfile_size = -1
  
        debug_print('lo:%d  re:%d' % (localfile_size, remotefile_size), )
  
        if remotefile_size == localfile_size:
  
            return 1
  
        else:
  
            return 0
  

  
    def download_file(self, localfile, remotefile):
  
        if self.is_same_size(localfile, remotefile):
  
            debug_print('%s 文件大小相同,无需下载' % localfile)
  
            return
  
        else:
  
            print "remotefile:",remotefile
  
            debug_print('>>>>>>>>>>>>下载文件 %s ... ...' % localfile)
  
            # return
  
        file_handler = open(localfile, 'wb')
  
        self.ftp.retrbinary('RETR %s' % (remotefile), file_handler.write)
  
        file_handler.close()
  

  
    def download_files(self, localdir='./', remotedir='./'):
  
        try:
  
            print "remotedir:",remotedir
  
            self.ftp.cwd(remotedir)
  
        except:
  
            debug_print('目录%s不存在,继续...' % remotedir)
  
            return
  
        if not os.path.isdir(localdir):
  
            # pass
  
            os.makedirs(localdir)
  
        debug_print('切换至目录 %s' % self.ftp.pwd())
  
        self.file_list = []
  
        print(self.ftp.dir())
  
        self.ftp.dir(self.get_file_list)
  
        remotenames = self.file_list
  
        # print(remotenames)
  
        # return
  
        for item in remotenames:
  
            filetype = item[0]
  
            filename = item[1]
  
            print "filename:",filename
  
            local = os.path.join(localdir, filename).replace('\\', '/')
  

  
            if filetype == 'd':
  
                self.download_files(local, filename)
  
            elif filetype == '-':
  
                self.download_file(local, filename)
  
        self.ftp.cwd('..')
  
        debug_print('返回上层目录 %s' % self.ftp.pwd())
  

  
    def upload_file(self, localfile, remotefile):
  
        if not os.path.isfile(localfile):
  
            return
  
        if self.is_same_size(localfile, remotefile):
  
            debug_print('跳过[相等]: %s' % localfile)
  
            return
  
        file_handler = open(localfile, 'rb')
  
        self.ftp.storbinary('STOR %s' % remotefile, file_handler)
  
        file_handler.close()
  
        debug_print('已传送: %s' % localfile)
  

  
    def upload_files(self, localdir='./', remotedir='./'):
  
        if not os.path.isdir(localdir):
  
            return
  
        localnames = os.listdir(localdir)
  
        self.ftp.cwd(remotedir)
  
        for item in localnames:
  
            src = os.path.join(localdir, item)
  
            if os.path.isdir(src):
  
                try:
  
                    self.ftp.mkd(item)
  
                except:
  
                    debug_print('目录已存在 %s' % item)
  
                self.upload_files(src, item)
  
            else:
  
                self.upload_file(src, item)
  
        self.ftp.cwd('..')
  

  
    def get_file_list(self, line):
  
        print "line1:", line
  
        ret_arr = []
  
        file_arr = self.get_filename(line)
  
        print "file_arr:",file_arr
  
        if file_arr[1] not in ['.', '..']:
  
            self.file_list.append(file_arr)
  

  
    def get_filename(self, line):
  
        print "line2:",line
  
        print type(line)
  
        pos = line.rfind(':')
  
        while (line[pos] != ' '):
  
            pos += 1
  
        while (line[pos] == ' '):
  
            pos += 1
  
        print pos
  
        file_arr = [line[0], line[pos:]]
  
        return file_arr
  

  

  
def debug_print(s):
  
    print (s)
  

  

  
def deal_error(e):
  
    timenow = time.localtime()
  
    datenow = time.strftime('%Y-%m-%d', timenow)
  
    logstr = '%s 发生错误: %s' % (datenow, e)
  
    debug_print(logstr)
  
    file.write(logstr)
  
    sys.exit()
  

  

  
if __name__ == '__main__':
  
    file = open("log.txt", "a")
  
    timenow = time.localtime()
  
    datenow = time.strftime('%Y-%m-%d', timenow)
  
    logstr = datenow
  
    # 配置如下变量
  
    hostaddr = '192.168.1.100'  # ftp地址
  
    username = 'ftpuser3'  # 用户名
  
    password = 'test1passwd'  # 密码
  

  

  
    port = 21  # 端口号
  
    #rootdir_local = '.' + os.sep + 'bak/'  # 本地目录
  
    rootdir_local = 'D:/ftp/'
  
    rootdir_remote = './'  # 远程目录
  

  
    f = MYFTP(hostaddr, username, password, rootdir_remote, port)
  
    f.login()
  
    f.download_files(rootdir_local, rootdir_remote)
  

  
    timenow = time.localtime()
  
    datenow = time.strftime('%Y-%m-%d', timenow)
  
    logstr += " - %s 成功执行了备份\n" % datenow
  
    debug_print(logstr)
  

  
    file.write(logstr)
  
    file.close()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549409-1-1.html 上篇帖子: Python版本DDOS***脚本 下篇帖子: Gearman Python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表