python备份脚本

编写backup.py脚本,实现如下目标:

  1. 须要支持彻底和增量备份
  2. 周一执行彻底备份
  3. 其余时间执行增量备份
  4. 备份文件须要打包为tar文件并使用gzip格式压缩

总体框架建立3个函数,分别实现彻底备份、增量备份、文件加密3种功能:

1.首先导入time模块,利用if进行判断,若是当地时间是星期一,执行彻底备份函数,不然执行增量备份函数,其中,通配符%a表明时间星期几缩写,上传参数分别为要备份的原目录、目标目录、md5字典存放目录python

2.调用彻底备份函数:vim

a)首先获取新文件名,将新文件名放入目标目录下,目的是定义备份文件的绝对路径,以写压缩方式打开目标目录下新文件,将原目录写入新文件中,完成彻底备份,其中os.path.join做用是将目录名和文件的基名拼接成一个完整的路径框架

b)了解os.walk()目录遍历器输出文件结构,利用for循环将要备份原目录中文件遍历出来做为字典键值对键, md5加密结果做为字典键值对的值(此时将原目录中文件做为上传参数调用文件加密函数),存入空字典中,字典中每一个文件对应一个md5值,最后将字典写入到md5字典存放目录中函数

3.调用文件加密函数:将原目录文件循环读取逐一加密,返回加密结果测试

4.调用增量备份函数:加密

a)增量备份函数代码与彻底备份函数基本一致ip

b)区别在于,备份前要先以二进制读方式打开md5字典存放目录,读取旧数据,判断旧数据中键对应的加密值与新加密值是否相同,若是不相同,则将新增内容写入到目标文件中(即只备份新数据)md5

5.注意:md5主要用于原文件与新文件判断get

 

步骤一:编写脚本

  1. vim backup.py
  2. #!/usr/bin/env python3
  3. import time
  4. import os
  5. import tarfile
  6. import hashlib
  7. import pickle
  8. #用于判断两个文件是否相同,提取每一个文件中的前4字节的内容而后输出md5码进行比较
  9. def check_md5(fname):
  10. m = hashlib.md5()
  11. with open(fname, 'rb') as fobj:
  12. while True:
  13. data = fobj.read(4096)
  14. if not data:
  15. break
  16. m.update(data)
  17. return m.hexdigest()
  18.  
  19. def full_backup(src_dir, dst_dir, md5file):
  20. fname = os.path.basename(src_dir.rstrip('/'))
  21. fname = '%s_full_%s.tar.gz' % (fname, time.strftime('%Y%m%d'))
  22. fname = os.path.join(dst_dir, fname)
  23. md5dict = {}
  24.  
  25. tar = tarfile.open(fname, 'w:gz')
  26. tar.add(src_dir)
  27. tar.close()
  28.  
  29. for path, folders, files in os.walk(src_dir):
  30. for each_file in files:
  31. key = os.path.join(path, each_file)
  32. md5dict[key] = check_md5(key)
  33.  
  34. with open(md5file, 'wb') as fobj:
  35. pickle.dump(md5dict, fobj)
  36.  
  37.  
  38. def incr_backup(src_dir, dst_dir, md5file):
  39. fname = os.path.basename(src_dir.rstrip('/'))
  40. fname = '%s_incr_%s.tar.gz' % (fname, time.strftime('%Y%m%d'))
  41. fname = os.path.join(dst_dir, fname)
  42. md5dict = {}
  43.  
  44. with open(md5file, 'rb') as fobj:
  45. oldmd5 = pickle.load(fobj)
  46.  
  47. for path, folders, files in os.walk(src_dir):
  48. for each_file in files:
  49. key = os.path.join(path, each_file)
  50. md5dict[key] = check_md5(key)
  51.  
  52. with open(md5file, 'wb') as fobj:
  53. pickle.dump(md5dict, fobj)
  54.  
  55. tar = tarfile.open(fname, 'w:gz')
  56. for key in md5dict:
  57. if oldmd5.get(key) != md5dict[key]:
  58. tar.add(key)
  59. tar.close()
  60.  
  61. if __name__ == '__main__':
  62. # mkdir /tmp/demo; cp -r /etc/security /tmp/demo
  63. src_dir = '/tmp/demo/security'
  64. dst_dir = '/var/tmp/backup' # mkdir /var/tmp/backup
  65. md5file = '/var/tmp/backup/md5.data'
  66. if time.strftime('%a') == 'Mon':
  67. full_backup(src_dir, dst_dir, md5file)
  68. else:
  69. incr_backup(src_dir, dst_dir, md5file)

步骤二:测试脚本执行

  1. python3 backup.py
  2. cd /var/tmp/backup/
  3. ls
  4. md5.data security_full_20180502.tar.gz security_incr_20180502.tar.gz