前提

Python3环境

安装百度云第三方库bypy

推荐Linux,Windows下应该也可以(博主没测试过)

脚本

大体分两个文件,一个是包装了bypy的自用类,一个是实际供命令行调用的主程序文件。

直接上代码,很多逻辑是博主自己用的,请自行根据需要删减或修改。

特别是发送短信提醒的功能,这个博主是使用了腾讯云的短信服务。读者请无视。(自行删除)

主程序

文件名:backupBaota.py (可以随意修改)

文件位置:/home/XXX/mytools/ (用户home目录下的mytools子目录,理论上任意文件夹都可以,不过博主没测试过)

#!/usr/bin/python
#-*- coding:utf-8 -*-
import os,sys
import logging
import requests,json
import time
import socket, getpass
from myLib import Backup2BDY
from myLib import MySmsLib# 本程序用于备份宝塔面板的定时备份,包括网站和数据库(宝塔面板设置每日一次备份,本程序在cron里也设置每日一次即可)
# 本程序需要Python3,并安装百度云命令行工具bypy
# crontab例子(注意cron命令中的logs文件夹需要提前准备好)
# 45 15 * * * cd ~/mytools/ ; python3 ~/mytools/backupBaota.py >>~/mytools/logs/backupBaota.std.log 2>&1currentPath = sys.path[0] + "/"# 日志输出配置
LOG_FILE = currentPath + "logs/backupBaota.log"
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
DATE_FORMAT = "%Y/%m/%d %H:%M:%S"
logging.basicConfig(filename=LOG_FILE, level=logging.INFO, format=LOG_FORMAT, datefmt=DATE_FORMAT)
#logging.basicConfig(level=logging.INFO, format=LOG_FORMAT, datefmt=DATE_FORMAT)# 保留多少份最新备份
KEEP_DAYS = 30# 用来取得文件名中的日期部分的正则表达式(用于保留指定份数的最新文件)
# Db_mlc_20210502_150501.sql.gz
# Web_mango.natappvip.cc_20210502_150002.tar.gz
DATE_REGX = r'.*(\d{8})_\d{6}.*'# 百度云远程目录
BDY_ROOT = '/raspiBackup/wwwBackup/'
BDY_PATH_SITE = BDY_ROOT + 'site/'
BDY_PATH_DATABASE = BDY_ROOT + 'database/'# 其他备份文件,一般是程序文件本身和日志文件,本地文件和远程路径成对设置即可
other_backup_list = []
other_backup_list.append([currentPath + "backupBaota.py", BDY_ROOT + 'tool/backupBaota.py'])
other_backup_list.append([currentPath + 'myLib/Backup2BDY.py', BDY_ROOT + 'tool/myLib/Backup2BDY.py'])
other_backup_list.append([currentPath + 'myLib/MySmsLib.py', BDY_ROOT + 'tool/myLib/MySmsLib.py'])
other_backup_list.append([LOG_FILE, BDY_ROOT + 'backupBaota.log'])# 配置完成,以下基本不用修改hostName = socket.gethostname()
execUser = getpass.getuser()
try:timeStart = time.time()logging.info("备份开始-----------------------------------------------------")logging.info("运行环境: Hostname [%s] User [%s]", hostName, execUser)# 发送提醒短信用工具类(不需要可注释掉)sms = MySmsLib.MySms()bdy = Backup2BDY.Backup2BDY()logging.info("开始备份database...")# 宝塔备份文件夹使用的是默认设置如果有变化需要修改bdy.backupFolder(localPath='/www/backup/database/', remotePath=BDY_PATH_DATABASE, \keepDays=KEEP_DAYS, dateRegx=DATE_REGX)logging.info("开始备份site...")bdy.backupFolder(localPath='/www/backup/site/', remotePath=BDY_PATH_SITE, \keepDays=KEEP_DAYS, dateRegx=DATE_REGX)logging.info("最后备份其他文件(覆盖)...")for row in other_backup_list:bdy.backupFile(row[0], row[1])# logging.info("备份成功,发送提醒短信...")# timeEnd = time.time()# ret = sms.send947195(hostName, "[备份宝塔站点]", "成功", "%d秒"%(timeEnd-timeStart), "无")# logging.info("提醒短信发送完毕。")logging.info("备份完成,程序终止。")except Exception as err:logging.error("出现未知错误\n{0}".format(err))logging.info("发送提醒短信...")timeEnd = time.time()ret = sms.send947195(hostName, "[备份宝塔站点]", "失败。", "%d秒"%(timeEnd-timeStart), "无")logging.info("提醒短信发送完毕,程序终止。")

包装类

文件名:Backup2BDY.py

文件位置:/home/XXX/mytools/myLib/ (主程序所在文件夹下的 myLib 子文件夹)

import os
import logging
import re
import shutil
from bypy import ByPyclass Backup2BDY:# 日志输出配置# LOG_FILE = "./Up2BDY.log"# LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"# DATE_FORMAT = "%Y/%m/%d %H:%M:%S"# logging.basicConfig(filename=LOG_FILE, level=logging.INFO, format=LOG_FORMAT, datefmt=DATE_FORMAT)# 获取远程目录下的文件名列表def __getRemoteFileList(self, remotePath):# 通过os.popen来执行bypy以获取标准输出内容(os.popen返回的其实是一个文件对象)fileNameList = []isIntroLine = TrueretFile = os.popen("python3 -m bypy list " + remotePath + " '$f'")for row in retFile:if (not isIntroLine):# 已跳过介绍部分文本,开始接收文件名fileNameList.append(row.replace('\n', ''))# 跳过输出结果开头的部分(MD5码不对之类的消息)# 直到输出/app/bypy/...才是真正需要的数据if (row.startswith("/app")):isIntroLine = FalseretFile.close()return fileNameList# 取得文件列表中的所有日期一览,倒序排列def __getDateListByFileNameList(self, fileNameList, dateRegx ):# 获取所有文件名中的日期,宝塔的站点和数据库备份文件名中会包含yyyymmdd_hhmmssdateList = []for fileName in fileNameList:matchObj = re.match( dateRegx, fileName)date = matchObj.group(1)if (date not in dateList):dateList.append(date)# 倒序排列dateList.sort(reverse=True)return dateList# 备份文件夹def backupFolder(self, localPath, remotePath, keepDays, dateRegx=r'.*(\d{8})_\d{6}.*'):# logging.info("test:localPath:%s, remotePath:%s, keepDays:%s, dateRegx:%s", localPath, remotePath, keepDays, dateRegx)# return# 定义百度云模块bp=ByPy()logging.info("本地文件夹:%s", localPath)logging.info("检查云盘中有无过期备份,只保留最新%d天(份)备份。", keepDays)logging.info("取得云盘文件夹「%s」中的文件列表...", remotePath)fileNameList = self.__getRemoteFileList(remotePath)# 取得文件列表中的所有日期一览,倒序排列dateList = self.__getDateListByFileNameList(fileNameList, dateRegx)logging.info("当前云盘上存在的备份日期列表")for date in dateList:logging.info("%s", date)# 根据定义的保留备份天数计算过期日期# 比如存在如下日期的文件#   20210415#   20210412#   20210407#   20210329#   20210203#    当备份天数=2,过期日期=20210407#    当备份天数=3,过期日期=20210329#    当备份天数>=5,没有过期文件if (keepDays < len(dateList)):outdate = dateList[keepDays]logging.info("存在过期备份,早于或等于日期「%s」的备份将被删除。", outdate)# 再次循环一次所有文件,并进行删除for fileName in fileNameList:matchObj = re.match( dateRegx, fileName)date = matchObj.group(1)# 删除过期备份if (date <= outdate):# 删除文件不需要获取标准输出的内容,所以这里直接调用模块而不是os.popenretCode = bp.delete(remotePath + fileName)if (retCode == 0):logging.info("过期备份「%s」删除成功。", remotePath + fileName)else:logging.warn("过期备份「%s」删除失败。", remotePath + fileName)else:logging.info("目前不存在过期备份。")# 上传本地文件夹,已存在的话覆盖logging.info("上传本地文件夹...")bp.upload(localPath, remotePath)# 上传完成以后再次取得远程文件文件列表便于检查showLastFileCnt = 10logging.info("上传完成。当前云盘上的最新%d个备份文件:", showLastFileCnt)fileNameList = self.__getRemoteFileList(remotePath)dateList = self.__getDateListByFileNameList(fileNameList, dateRegx)cnt = 1for date in dateList:if (cnt <= showLastFileCnt) :for fileName in fileNameList :if (cnt <= showLastFileCnt) :if (fileName.find(date) != -1) :logging.info("[%02d] %s", cnt, fileName)cnt = cnt + 1# 备份文件def backupFile(self, localFile, remoteFile):bp=ByPy()logging.info("本地文件: %s", localFile)logging.info("远程文件: %s", remoteFile)logging.info("上传中...")bp.upload(localFile, remoteFile)logging.info("完成")

版权属于:芒果爱吃胡萝卜

Python脚本上传本地文件到百度云相关推荐

  1. 上传本地项目到gitee_用git上传本地文件到码云gitee的方法

    首先登录码云 https://gitee.com/,注册一个账号,并登录账号. 1. 在码云上创建项目 在码云首页顶部,下图所示,右上角头像旁边的加号,鼠标移上去会显示下拉的,点击"新建项目 ...

  2. 如何使用git上传本地文件到码云上【详细步骤】

    1.首先进入项目的目录下,比如: 2.然后右键空白区域打开,进入git bash,git的安装就不说了,自行翻阅  git专栏 3.在码云上建立 一个仓库.然后输入以下命令: git config - ...

  3. 一行js_Node.js 一行命令上传本地文件到服务器

    每次打包完, 都要打开 FileZilla 一顿拖拽然后才能上传代码, 那就立马撸一个自动化脚本就完事了 publish-sftp Github 传送门(~~~~顺便来骗个Star~~~~) 以后一行 ...

  4. python实现文件下载-python实现上传下载文件功能

    最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify. 文件上传 - 后台view 的 Python代码如下: @csrf_exem ...

  5. 向腾讯云windows服务器传输文件,如何上传本地文件到腾讯云Windows服务器上?

    在做运维的过程中经常遇见客户问,如何上传本地数据到Windows云服务器上. 相对Linux云服务器,针对新人朋友Windows云服务器是可视化的更加容易理解.云服务器就是我们租用了腾讯云机房的一台服 ...

  6. 码云上传本地文件夹,码云只能上传20个文件的突破方法

    码云官方地址:https://gitee.com/ 很多人不知道码云上传本地文件夹怎么操作,或者如何突破码云只能上传20个文件限制的问题,今天就来说说这事的方法吧. 简介: 码云是媲美GitHub的代 ...

  7. 码云上传文件夹_码云上传本地文件夹,码云只能上传20个文件的突破方法

    码云官方地址:https://gitee.com/ 很多人不知道码云上传本地文件夹怎么操作,或者如何突破码云只能上传20个文件限制的问题,今天就来说说这事的方法吧. 简介: 码云是媲美GitHub的代 ...

  8. Git安装及密钥的生成并上传本地文件到GitHub上

    之前用的GitHub,不太熟练,一直在上传的过程中遇到了一些问题,看了网上诸多教程,总觉得很乱,特参考一些资料,总结了一篇完整的操作步骤,从下载安装到上传文件,亲测有效 1.下载Git软件:https ...

  9. python 文件上传下载,python实现上传下载文件功能

    最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify. 文件上传 - 后台view 的 Python代码如下: @csrf_exem ...

最新文章

  1. 云时代架构阅读笔记二——一次CPU负载超高的分析
  2. mysqL学习之实例
  3. 【深度学习】transformer 真的快要取代计算机视觉中的 CNN 吗?
  4. 这位挪威博士是如何成为阿里云PolarDB资深架构师的?
  5. Ruby离线安装gem依赖
  6. 数据结构---关键路径
  7. python attention机制_从零开始学Python自然语言处理(26)—— 强大的Attention机制...
  8. easyPR源码解析之plate_judge.h
  9. python设计模式21-策略模式
  10. 中国内鼻扩张器市场趋势报告、技术动态创新及市场预测
  11. USB-HDD/ZIP/HDD+/ZIP+/CDROM(量产) U盘启动模式简介
  12. 手把手教你建立数据指标体系
  13. 酒店管理系统 java_java酒店管理系统项目书.pdf
  14. 华为鸿蒙备胎计划,重磅!华为启动“备胎”计划,神秘项目曝光代号
  15. 基于单片机的自动追日系统设计_基于单片机控制的简易逐日式太阳能发电系统...
  16. Flask-SQLAlchemy的使用(详解)
  17. 4G套餐用户挺住了,运营商比你们急,会给优惠的低价流量
  18. 电脑卡顿反应慢解决办法
  19. 下载的软件包保存在缓存中,直到下次成功执行事务。 您可以通过执行 'dnf clean packages' 删除软件包缓存。 错误:事务检查错误
  20. java 虚拟机内存类_java 虚拟机类加载 及内存结构

热门文章

  1. 台湾赛微CW3002G识别快充方案|CW3002G产品资料|CW3002G设计资料
  2. glade-2:安装经验
  3. 一个数的因子、因数的区别
  4. Hankson的趣味题
  5. poj3208 启示录 数位dp
  6. 单片机节日彩灯实训报告_单片机数字钟实训报告
  7. prlooks插件下载_Looks 调色预设大合集(Mac/Win)Preset Looks Pack for Magic Bullet Looks
  8. 青西新区与航天科工二院合作 打造特色智慧城市
  9. Mobox项目文档管理-项目经理必备工具
  10. erlang rebar 配置mysql_使用rebar构建erlang工程,手把手入门版