python备份发包脚本_Python备份脚本,python
編寫backup.py腳本,實(shí)現(xiàn)以下目標(biāo):
需要支持完全和增量備份
周一執(zhí)行完全備份
其他時間執(zhí)行增量備份
備份文件需要打包為tar文件并使用gzip格式壓縮
整體框架創(chuàng)建3個函數(shù),分別實(shí)現(xiàn)完全備份、增量備份、文件加密3種功能:
1.首先導(dǎo)入time模塊,利用if進(jìn)行判斷,如果當(dāng)?shù)貢r間是星期一,執(zhí)行完全備份函數(shù),否則執(zhí)行增量備份函數(shù),其中,通配符%a代表時間星期幾縮寫,上傳參數(shù)分別為要備份的原目錄、目標(biāo)目錄、md5字典存放目錄
2.調(diào)用完全備份函數(shù):
a)首先獲取新文件名,將新文件名放入目標(biāo)目錄下,目的是定義備份文件的絕對路徑,以寫壓縮方式打開目標(biāo)目錄下新文件,將原目錄寫入新文件中,完成完全備份,其中os.path.join作用是將目錄名和文件的基名拼接成一個完整的路徑
b)了解os.walk()目錄遍歷器輸出文件結(jié)構(gòu),利用for循環(huán)將要備份原目錄中文件遍歷出來作為字典鍵值對鍵, md5加密結(jié)果作為字典鍵值對的值(此時將原目錄中文件作為上傳參數(shù)調(diào)用文件加密函數(shù)),存入空字典中,字典中每個文件對應(yīng)一個md5值,最后將字典寫入到md5字典存放目錄中
3.調(diào)用文件加密函數(shù):將原目錄文件循環(huán)讀取逐一加密,返回加密結(jié)果
4.調(diào)用增量備份函數(shù):
a)增量備份函數(shù)代碼與完全備份函數(shù)基本一致
b)區(qū)別在于,備份前要先以二進(jìn)制讀方式打開md5字典存放目錄,讀取舊數(shù)據(jù),判斷舊數(shù)據(jù)中鍵對應(yīng)的加密值與新加密值是否相同,如果不相同,則將新增內(nèi)容寫入到目標(biāo)文件中(即只備份新數(shù)據(jù))
5.注意:md5主要用于原文件與新文件判斷
步驟一:編寫腳本
vim backup.py
#!/usr/bin/env python3
import time
import os
import tarfile
import hashlib
import pickle
#用于判斷兩個文件是否相同,提取每個文件中的前4字節(jié)的內(nèi)容然后輸出md5碼進(jìn)行比較
def check_md5(fname):
m = hashlib.md5()
with open(fname, 'rb') as fobj:
while True:
data = fobj.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
def full_backup(src_dir, dst_dir, md5file):
fname = os.path.basename(src_dir.rstrip('/'))
fname = '%s_full_%s.tar.gz' % (fname, time.strftime('%Y%m%d'))
fname = os.path.join(dst_dir, fname)
md5dict = {}
tar = tarfile.open(fname, 'w:gz')
tar.add(src_dir)
tar.close()
for path, folders, files in os.walk(src_dir):
for each_file in files:
key = os.path.join(path, each_file)
md5dict[key] = check_md5(key)
with open(md5file, 'wb') as fobj:
pickle.dump(md5dict, fobj)
def incr_backup(src_dir, dst_dir, md5file):
fname = os.path.basename(src_dir.rstrip('/'))
fname = '%s_incr_%s.tar.gz' % (fname, time.strftime('%Y%m%d'))
fname = os.path.join(dst_dir, fname)
md5dict = {}
with open(md5file, 'rb') as fobj:
oldmd5 = pickle.load(fobj)
for path, folders, files in os.walk(src_dir):
for each_file in files:
key = os.path.join(path, each_file)
md5dict[key] = check_md5(key)
with open(md5file, 'wb') as fobj:
pickle.dump(md5dict, fobj)
tar = tarfile.open(fname, 'w:gz')
for key in md5dict:
if oldmd5.get(key) != md5dict[key]:
tar.add(key)
tar.close()
if __name__ == '__main__':
# mkdir /tmp/demo; cp -r /etc/security /tmp/demo
src_dir = '/tmp/demo/security'
dst_dir = '/var/tmp/backup' # mkdir /var/tmp/backup
md5file = '/var/tmp/backup/md5.data'
if time.strftime('%a') == 'Mon':
full_backup(src_dir, dst_dir, md5file)
else:
incr_backup(src_dir, dst_dir, md5file)
步驟二:測試腳本執(zhí)行
python3 backup.py
cd /var/tmp/backup/
ls
md5.data security_full_20180502.tar.gz security_incr_20180502.tar.gz
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python备份发包脚本_Python备份脚本,python的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python selenium 验证码识
- 下一篇: 尹成python爬虫百度云_Python