ftp自动备份功能

ftp服务器文档自动备份功能

本来想使用python实现的,ftplib库:

Python实现

用下边这个代码实现了,但是运行起来还有点问题,代码我在这里贴出来了:

#!/usr/bin/python  
#coding=utf-8  
''''' 
    ftp自动下载、自动上传脚本,可以递归目录操作 
'''  

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 = 30000  
            socket.setdefaulttimeout(timeout)  
            ftp.set_pasv(True)  
            print '开始连接到 %s' %(self.hostaddr)  
            ftp.connect("192.168.100.10","21")  
            print '成功连接到 %s' %(self.hostaddr)  
            print '开始登录到 %s' %(self.hostaddr)  
            ftp.login("jiangwei", "123456")  
            print '成功登录到 %s' %(self.hostaddr)  
            debug_print(ftp.getwelcome())  
        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:  
            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:  
            self.ftp.cwd(remotedir)  
        except:  
            debug_print('目录%s不存在,继续...' %remotedir)  
            return  
        if not os.path.isdir(localdir):  
            os.makedirs(localdir)  
        debug_print('切换至目录 %s' %self.ftp.pwd())  
        self.file_list = []  
        self.ftp.dir(self.get_file_list)  
        remotenames = self.file_list  
        #print(remotenames)  
        #return  
        for item in remotenames:  
            filetype = item[0]  
            filename = item[1]  
            local = os.path.join(localdir, filename)  
            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):  
        ret_arr = []  
        file_arr = self.get_filename(line)  
        if file_arr[1] not in ['.', '..']:  
            self.file_list.append(file_arr)  

    def get_filename(self, line):  
        pos = line.rfind(':')  
        while(line[pos] != ' '):  
            pos += 1  
        while(line[pos] == ' '):  
            pos += 1  
        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.100.10' # ftp地址   
        username = 'jiangwei' # 用户名  
        password = '123456' # 密码  
        port  =  21   # 端口号   
        rootdir_local  = '/home/ian/work/' # 本地目录  
        rootdir_remote = "/work"          # 远程目录  

        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()  
... prompt'''

然后我就发现了一个牛逼的东西,叫:ncftpget
实现代码:

ncftpget -R -u uftp -p 123123 192.168.100.10 /home/work /home/uftp/work

这个代码自动备份一个 192.168.100.10 服务器上的文件,运行了几个月没有出问题。
注意:服务器IP和账户名密码我都是随便改的,需要改成你自己的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值