基于 Python + Proftpd 实现文件自动备份

一、环境概述

1.概述

作用:将项目服务器的重要需备份文件自动定期备份至公司内部的服务器

架构:FTP 服务器部署于内网服务器,为被动模式,通过防火墙映射21端口和通信端口,使外网的机器可以访问。客户端为Linux或Windows服务器,通过python脚本(版本为python 2)将本地需要备份的文件定时打包上传至 FTP 服务器

2.服务器配置说明

角色 操作系统 IP 地址 备注
备份客户端 centos 6/7、Windows 192.168.101-103
FTP 服务器 centos 7.4 192.168.1.9 使用 ftp 软件为 proftpd

二、proftpd 服务器部署

1.EPEL 安装

[root@localhost ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm

2.proftpd 与 OpenSSL 安装

[root@localhost ~]# yum install -y proftpd openssl proftpd-utils

3.启动proftpd服务

[root@localhost ~]# systemctl start proftpd.service
[root@localhost ~]# systemctl enable proftpd.service

4.防火墙设置

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=ftp
[root@localhost ~]# firewall-cmd --reload

5.ftp用户创建

[root@localhost ~]# groupadd ftpgroup
## 设置 /ftpshare 目录为 proftpd 用户的家目录
[root@localhost ~]# useradd -G ftpgroup proftpd -s /sbin/nologin -d /ftpshare
[root@localhost ~]# passwd proftpd

6.proftpd 服务器配置

[root@localhost ~]# cp /etc/proftpd.conf /etc/proftpd.conf.bak
[root@localhost ~]# vi /etc/proftpd.conf
## 设置被动模式端口为 6000-6100
PassivePorts 6000 6100
## 设置被动模式返回地址为映射的公网地址
MasqueradeAddress xxx.xxx.xxx.xxx
## 设置超时时间为 600
TimeoutIdle 600

7.防火墙开放通信端口

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-port=6000-6100/tcp
[root@localhost ~]# firewall-cmd --reload

8.重启服务

[root@localhost ~]# systemctl restart proftpd.service

三、客户端配置

1.Linux 服务器配置

1.1 创建ftp备份脚本
[root@localhost ~]# cat /opt/backup_to_ftp_for_linux.py 

#!/usr/bin/python
# _*_ coding: utf-8 _*_
# CREATE DATE:2018/10/27
# AUTHOR: Liuzy
# 脚本作用:
## 1.将ftp提供下载的文件下载至本地
## 2.将本地需要备份的文件打包上传至ftp服务器的备份目录下

import shutil, os, datetime, zipfile, sys,  socket
from ftplib import FTP

# 定义当前时间格式
time = datetime.datetime.now()
ytime = time + datetime.timedelta(days=-1)
nowtime = datetime.datetime.now().strftime("%Y%m%d")
yestime = ytime.strftime("%Y%m%d")
# 运行脚本的服务器地址
localhost = ‘xxx.xxx.xxx.xxx‘
# 服务器需要备份的文件列表
backupfiledir = ["/dbbackup/evedayback/",
                 "/dbbackup/eveweekback/"]
backupfiledirname = [yestime+"_table", yestime+"_database"]
# 备份所需信息,包括ftp服务器地址、端口、备份ftp用户名、密码
backupinfo = ["xxx.xxx.xxx.xxx", 21, "proftpd", "Password123"]
# 定义备份文件存放文件夹的名称格式
backupdirname = localhost + ‘_‘ + yestime + ‘_‘ + "backupfile"

class ftpserver:
    def __init__(self, host, port, username, password, localpath):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.localpath = localpath

    def connect(self):
        ftp = FTP()
        ftp.connect(self.host, self.port)
        ftp.login(self.username, self.password)
        return ftp

    def backupfile(self):
        bufsize = 1024
        # 尝试创建备份文件存放文件夹
        try:
            os.mkdir(backupdirname)
        except Exception as e:
            print("目录 %s 已存在" % backupdirname)
        # 拷贝备份文件所在文件夹至指定文件夹
        bcd = os.getcwd()+os.sep+backupdirname+"/"+yestime+"/"
        try:
            shutil.copytree(backupfiledir[0]+backupfiledirname[0], bcd+backupfiledirname[0])
        except OSError:
            print("目录不存在")
        try:
            shutil.copytree(backupfiledir[1]+backupfiledirname[1], bcd+backupfiledirname[1])
        except OSError:
            print("目录不存在")
        print("拷贝文件夹 %s 至目录 %s" % (backupfiledirname, backupdirname))
        # 压缩备份文件夹
        filelist = []
        backupzipname = backupdirname+‘.tar‘
        if os.path.isfile(backupdirname):
            filelist.append(backupdirname)
        else:
            for root,dirs,files in os.walk(backupdirname):
                for name in files:
                    filelist.append(os.path.join(root,name))
        zf = zipfile.ZipFile(backupzipname,"w",zipfile.ZIP_DEFLATED,allowZip64=True)
        for tar in filelist:
            arcname = tar[len(backupdirname):]
            zf.write(tar,arcname)
        zf.close()
        # 连接ftp服务器,备份文件
        ftp = ftpserver.connect(self)
        try:
            ftp.mkd(localhost)
        except Exception as e:
            print("目录 %s 已存在" % localhost)
        fp = open(backupzipname, ‘rb‘)
        print("开始备份文件 %s ... " % backupzipname)
        ftp.storbinary(‘STOR ‘ + localhost + ‘/‘ +  backupzipname, fp, bufsize)
        ftp.set_debuglevel(0)
        fp.close()
        print("成功备份文件 %s 至服务端 %s" % (backupzipname, localhost + ‘/‘ + backupzipname))
        ftp.quit()
        # 删除存放备份文件的临时文件夹与压缩包
        try:
            os.unlink(backupzipname)
            shutil.rmtree(backupdirname)

        except Exception as e:
            print(e)

backup = ftpserver(backupinfo[0], backupinfo[1], backupinfo[2], backupinfo[3], "")
backup.backupfile()
1.2 创建启动 python脚本的 shell 脚本
[root@localhost ~]# cat /opt/backup_ftp.sh
#!/bin/bash
## set backup python scripts path
PY_HOME=/opt/

cd $PY_HOME
nohup ./backup_to_ftp_for_linux.py >/dev/null 2>&1 &
1.3 根据实际需求将脚本加入定时任务
[root@localhost ~]# crontab -e
0 2 * * * /opt/backup_ftp.sh

2.windows 客户端配置

2.1 编写备份 python 脚本
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# CREATE DATE:2018/10/27
# AUTHOR: Liuzy
# 脚本作用:
## 1.将ftp提供下载的文件下载至本地
## 2.将本地需要备份的文件打包上传至ftp服务器的备份目录下

import shutil, os, datetime, zipfile, sys, socket
from ftplib import FTP

# 定义当前时间
time = datetime.datetime.now()
ytime = time + datetime.timedelta(days=-1)
nowtime = datetime.datetime.now().strftime("%Y%m%d")
yestime = ytime.strftime("%Y%m%d")
# 运行脚本的服务器地址
localhost = socket.gethostbyname(socket.gethostname())
# 服务器需要备份的文件列表
backupfiledir = ["D:/dbbackup/evedayback/",
                 "D:/dbbackup/eveweekback/"]
backupfiledirname = [yestime+"_table", yestime+"_database"]
# 备份所需信息,包括ftp服务器地址、端口、备份ftp用户名、密码
backupinfo = ["xxx.xxx.xxx.xxx", 21, "proftpd", "Password123"]
# 定义备份文件存放文件夹的名称格式
backupdirname = localhost + ‘_‘ + yestime + ‘_‘ + "backupfile"

class ftpserver:
    def __init__(self, host, port, username, password, localpath):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.localpath = localpath

    def connect(self):
        ftp = FTP()
        ftp.connect(self.host, self.port)
        ftp.login(self.username, self.password)
        return ftp

    def backupfile(self):
        bufsize = 1024

        # 尝试创建备份文件存放文件夹
        try:
            os.mkdir(backupdirname)
        except Exception as e:
            print("目录 %s 已存在" % backupdirname)

        # 拷贝备份文件所在文件夹至指定文件夹
        bcd = os.getcwd()+os.sep+backupdirname+"/"+yestime+"/"
        try:
            shutil.copytree(backupfiledir[0]+backupfiledirname[0], bcd+backupfiledirname[0])
        except IOError:
            print("目录不存在")
        except WindowsError:
            print("目录不存在")
        try:
            shutil.copytree(backupfiledir[1]+backupfiledirname[1], bcd+backupfiledirname[1])
        except IOError:
            print("目录不存在")
        except WindowsError:
            print("目录不存在")
        print("拷贝文件夹 %s 至目录 %s" % (backupfiledirname, backupdirname))

        # 压缩备份文件夹
        filelist = []
        backupzipname = backupdirname+‘.tar‘
        if os.path.isfile(backupdirname):
            filelist.append(backupdirname)
        else:
            for root,dirs,files in os.walk(backupdirname):
                for name in files:
                    filelist.append(os.path.join(root,name))
        zf = zipfile.ZipFile(backupzipname,"w",zipfile.ZIP_DEFLATED,allowZip64=True)
        for tar in filelist:
            arcname = tar[len(backupdirname):]
            zf.write(tar,arcname)
        zf.close()

        # 连接ftp服务器,备份文件
        ftp = ftpserver.connect(self)
        try:
            ftp.mkd(localhost)
        except Exception as e:
            print("目录 %s 已存在" % localhost )
        fp = open(backupzipname, ‘rb‘)
        print("开始备份文件 %s ... " % backupzipname)
        ftp.set_debuglevel(2)
        try:
            ftp.storbinary(‘STOR ‘ + localhost + ‘/‘ +  backupzipname, fp, bufsize)
        except:
            print("error")
        # ftp.set_pasv(0)
        ftp.set_debuglevel(0)
        fp.close()
        print("成功备份文件 %s 至服务端 %s" % (backupzipname, localhost + ‘/‘ + backupzipname))
        ftp.quit()

        # 删除存放备份文件的临时文件夹与压缩包
        try:
            os.unlink(backupzipname)
            shutil.rmtree(backupdirname)

        except Exception as e:
            print(e)

backup = ftpserver(backupinfo[0], backupinfo[1], backupinfo[2], backupinfo[3], "")
backup.backupfile()
2.2 使用 pyinstaller 打包脚本为可执行 exe
2.3 将可执行 exe 加入客户端任务计划程序

原文地址:http://blog.51cto.com/11768466/2352647

时间: 2024-10-03 22:29:12

基于 Python + Proftpd 实现文件自动备份的相关文章

RMAN兼容性、控制文件自动备份、保存时间、备份策略、备份脚本(二)

RMAN 程序的兼容性 RMAN 环境由以下5部分组成:(1) RMAN executable(2) Recovery catalog database(3) Recovery catalog schema in the recovery catalog database(4) Target database(5) Auxiliary database (used forduplicate, duplicate for standby or tablespace point-in-time re

文件自动备份工具

从数据开始产生的那一刻开始,就应该要做好备份的习惯.那么多的数据如果手动备份肯定得忙活老半天.借助一款值得信赖的自动备份工具是事半功倍的! 使用多备份客户端可以轻松实现文件自动备份,步骤如下: 1.首先注册账号,然后进入多备份控制面板,下载客户端,接着客户端下载完毕解压并打开dbfen 2.然后就双击dbfen.exe让程序运行,随后就会弹出页面--在文件的按钮中单击让其打开,开始文件备份 3.进入文件备份选项以后选择要备份的文件,然后选择自动备份频率,最后创建任务,即可实现文件自动备份.在有需

服务器文件自动备份工具

网站经常需要定期备份文件,天天折腾累死人 ,索性写了个自动备份 的工具,让它运行在服务器上,每天凌晨自动将需要备份的数据打包成压缩文件并传到另外的服务器. 1.定时执行任务,用到开源框架Quartz.net 使用方法: 引用Quartz.dll IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); IJobDetail job = JobBuilder.Create<HelloJo

模糊查询基于select遍历json文件自动填充的实现

HTML页面 <tr> <td align="left"><span>案由</span> <input type="text" name="ay" id="ay" value="" placeholder="输入内容之后,回车键可进行模糊检索!" onclick="showAy()" onkeypress=&quo

打造百度网盘备份利器:自动备份Linux VPS文件和多线程下载百度网盘资源

前一段时间国内的各大网盘百度云盘,金山快盘,360云盘,华为网盘为争夺用户上演空间容量博弈,网盘商们还固执地以为中国的网民都不懂网络技术,可以像某公司那样用一些数字的手段来忽悠用户,参与到网盘商的数字游戏中的公司都心知肚明. 在不需要增加任何网盘上传下载带宽和硬件设备投入的情况下,又可以用TB级别网盘这样的字眼来夺人眼球,在网络上大肆炒作一番,这比用钱买广告来推广网盘有效得多了.在这场网盘炒作中,率先“挑起事非”的两家百度网盘和360网盘获利最多. 尤其是百度网盘,应该算正式成长为国内网盘界中老

利用rman自动备份转储spfile

[情景简介] 生产环境丢失了服务器的参数文件,rman已开启自动备份设置. [操作过程简述] ----启动rman $rman target / ----检查rman设置 RMAN> show all; ----配置一遍rman自动备份控制文件,模拟初次设置rman自动备份控制文件 RMAN>CONFIGURE CONTROLFILEAUTOBACKUP ON; RMAN>CONFIGURE CONTROLFILEAUTOBACKUP FORMAT FOR DEVICE TYPE DIS

文件夹备份软件

天气愈发的热,心里就开始烦躁起来吧.如果在备份数据的时候出了什么差错心里更是急的直跺脚!有什么软件可以自动备份省去手动备份的时间吗? 答案是必然的,使用多备份客户端可以轻松实现文件自动备份,步骤如下: 1.首先注册账号,然后进入多备份控制面板,下载客户端,接着客户端下载完毕解压并打开dbfen 2.然后就双击dbfen.exe让程序运行,随后就会弹出页面--在文件的按钮中单击让其打开,开始文件备份 3.进入文件备份选项以后选择要备份的文件,然后选择自动备份频率,最后创建任务,即可实现文件自动备份

python多线程自动备份华为H3C交换机配置和LOG

之前试过用expect结合bash脚本备份交换机LOG,但由于是串行执行,设备很多的情况下耗时太长,而且经常出错导致备份不完整.于是在网上找python多线程处理的相关文章,但基本都是基于tftp备份当时运行的配置文件,不能根据自定义巡检命令取得返回结果,我想要的是类似SECURECRT下用.vbs脚本备份的效果,所以根据网上一些例子做了这个备份脚本.由于是多线程执行,所以执行时长决定于最多配置的那台设备的命令运行时长. [[email protected] shell]# cat /etc/r

cnblogs博客下载-cnblogs博客导出-cnblogs博客备份工具-基于python

http://blog.csdn.net/infoworld/article/details/19547723 以下代码是基于infoworld的csdn备份python代码修改的cnblogs博客备份,但是和infoworld的界面不匹配,只能够用在python里面.python确实有意思,开发很快,怪不得这么流行. #! encoding=utf-8 #cnblogs博客备份,使用方法:修改最下面的url和output,然后执行就可以了. import urllib2 import re i