高效WebDAV备份解决方案:Shell与Python双版本脚本详解

📌 方案概述

这是一套专为WebDAV服务器设计的备份脚本工具,包含Shell和Python两个版本,支持本地备份创建、WebDAV远程上传、备份文件数量管理、大文件处理及完整性校验等核心功能。无论是个人文件归档还是服务器数据备份,均可通过简单配置实现自动化流程,兼顾稳定性与灵活性。

🌟 WebDAV服务推荐

若您需要稳定的WebDAV存储服务,优先推荐以下方案:

  • InfiniCloud:注册即享20GB基础存储空间,输入推荐码 QXPSY 可额外获得5GB,总计25GB免费容量,满足中小型备份需求。
    🔗 立即注册

📋 环境要求与下载方式

一、🐚 Shell版本(适用于Linux/macOS/WSL)

环境依赖

  • 操作系统:支持Bash的环境(Linux全版本、macOS 10.14+、Windows Subsystem for Linux 2+)
  • 工具依赖

    • curl(≥7.19.0,需支持-C -断点续传参数)
    • tar(使用tar.gz格式时必备,建议tar 1.30+以支持压缩优化)
    • zip(使用zip格式时必备,zip 3.0+兼容性更佳)
  • 权限要求:对源目录有权限、本地备份目录有读写权限、WebDAV服务器有访问+上传+创建目录权限。

下载方式

国内环境(Gitee镜像,速度更快,规避网络波动)
wget https://gitee.com/wmwlwmwl/pagoda-happy-edition/raw/master/Linux/WebDAV_Backup/webdav_backup.sh
国外环境(GitHub原生地址,适合海外服务器)
wget https://raw.githubusercontent.com/wmwlwmwl/WebDAV_Backup/refs/heads/main/webdav_backup.sh

二、🐍 Python版本(适用于跨平台场景)

环境依赖

  • Python版本:3.6及以上(推荐3.8+,兼容新特性且稳定性更好)
  • 库依赖requests(用于WebDAV通信,需requests 2.25.0+以支持断点续传)
  • 内置库smtplibemail(Python标准库自带,无需额外安装)
  • 权限要求:与Shell版本一致,需对应目录读写权限及WebDAV访问权限。

下载方式

国内环境(Gitee镜像,速度更快)
wget https://gitee.com/wmwlwmwl/pagoda-happy-edition/raw/master/Linux/WebDAV_Backup/webdav_backup.py
国外环境(GitHub原生地址)
wget https://raw.githubusercontent.com/wmwlwmwl/WebDAV_Backup/refs/heads/main/webdav_backup.py

⚙️ 核心配置参数详解

使用前需在脚本头部修改关键参数,以下为完整配置示例(以Shell版本为例,Python版本参数含义完全一致),建议按注释逐行核对

# ==================== 基础备份配置 ====================
SOURCE_DIR="/path/to/source/directory"          # 要备份的源目录(必填,例:/data/wwwroot)
WEBDAV_BASE_URL="https://your-webdav-server.com" # WebDAV服务器基础地址(必填,例:https://dav.infini-cloud.net)
WEBDAV_UPLOAD_DIR="backups/docs"                # WebDAV上的上传目录(相对于基础地址,例:backups/server1)
WEBDAV_USER="your_username"                     # WebDAV用户名(必填,注册时的账号)
WEBDAV_PASS="your_password"                     # WebDAV密码(必填,建议后续通过环境变量存储,避免明文)
LOCAL_BACKUP_DIR="/path/to/local/backups"       # 本地备份保存目录(必填,需足够空间,例:/backup/local)
BACKUP_PREFIX="backup"                          # 备份文件前缀(自定义,例:server1_backup)
MAX_REMOTE_BACKUPS=5                            # WebDAV保留的最大备份数量(建议3-10,避免占用过多远程空间)
MAX_LOCAL_BACKUPS=3                             # 本地保留的最大备份数量(建议2-5,平衡空间与冗余)
BACKUP_FORMAT="tar.gz"                          # 备份文件格式(可选:tar.gz(压缩率高)、zip(跨平台))

# ==================== 文件上传参数 ====================
USE_SEPARATE_FILE_PARAMS=true                   # 是否区分大文件和非大文件(true=区分,false=统一用大文件参数)
LARGE_FILE_THRESHOLD=100                        # 大文件定义(MB,仅USE_SEPARATE_FILE_PARAMS=true时生效)
CONNECT_TIMEOUT=30                               # 所有文件的连接超时时间(秒,建议30-60,避免无限等待)

# 非大文件上传参数(文件≤LARGE_FILE_THRESHOLD时生效)
SMALL_FILE_MAX_TIME=1800                         # 最大上传时间(秒,默认30分钟,小文件无需过长)
SMALL_FILE_RATE_LIMIT="2M"                        # 上传速度限制(格式:数字+单位,例:2M=2MB/s,空字符串""=无限制)
                                                 # 【注意】Python版本暂不支持上传速度限制,此参数会被忽略

# 大文件上传参数(文件>LARGE_FILE_THRESHOLD时生效)
LARGE_FILE_MAX_TIME=7200                         # 最大上传时间(秒,默认2小时,大文件需预留足够时间)
LARGE_FILE_RATE_LIMIT="1M"                        # 上传速度限制(建议1-5M/s,避免占用全部带宽)
                                                 # 【注意】Python版本暂不支持上传速度限制,此参数会被忽略

# ==================== 完整性检测参数 ====================
ENABLE_INTEGRITY_CHECK=true                      # 是否启用上传后完整性检测(true=启用,建议开启)
INTEGRITY_CHECK_TIMEOUT=300                      # 完整性检测超时时间(秒,默认5分钟,避免检测耗时过长)
ENABLE_MD5_VERIFICATION=true                     # 是否启用MD5校验和验证(true=启用,进一步确保文件完整)
MD5_VERIFICATION_EXCLUDE_THRESHOLD=100           # 跳过MD5验证的文件大小(MB,例:100=100MB以上文件不校验,避免耗时)

# ==================== 邮箱通知参数(双版本均支持) ====================
ENABLE_EMAIL_NOTIFICATION=false                  # 是否启用邮箱通知(true=启用,建议开启以便及时知晓结果)
ENABLE_EMAIL_SUCCESS_NOTIFICATION=true           # 是否发送成功通知(true=发送,按需关闭)
ENABLE_EMAIL_FAILURE_NOTIFICATION=true           # 是否发送失败通知(true=发送,建议强制开启)
SMTP_SERVER="smtp.example.com"                   # SMTP服务器地址(例:QQ邮箱=smtp.qq.com,网易=smtp.163.com)
SMTP_PORT=587                                    # SMTP端口(常用:25=无加密,587=TLS,465=SSL,需与SMTP_USE_TLS匹配)
SMTP_USERNAME="your_email@example.com"           # SMTP用户名(通常是发件人邮箱地址)
SMTP_PASSWORD="your_email_password"              # SMTP密码(注意:QQ/网易等需用「独立授权码」,而非登录密码)
SMTP_USE_TLS=true                                # 是否使用TLS加密(true=启用,配合587端口;false=不启用,配合25端口)
EMAIL_FROM="your_email@example.com"              # 发件人邮箱(需与SMTP_USERNAME一致)
EMAIL_FROM_NAME="WebDAV备份系统"                  # 发件人名称(邮件中显示,例:服务器A备份系统)
EMAIL_TO="recipient@example.com"                 # 收件人邮箱(多个邮箱用逗号分隔,例:a@xxx.com,b@xxx.com)
EMAIL_SUBJECT_PREFIX="服务器"                     # 邮件主题前缀(最终主题:[服务器]WebDAV备份结果)

参数补充说明(易混淆点)

易混淆参数常见错误示例正确配置建议
WEBDAV_BASE_URLhttps://dav.example.com/末尾可带/或不带,脚本会自动兼容,但建议统一格式(如不带/)
SMTP_PASSWORD用QQ邮箱登录密码需用QQ邮箱「独立授权码」(在邮箱设置-账户中开启)
MD5_VERIFICATION_EXCLUDE_THRESHOLD设为00=所有文件校验,大文件会耗时,建议设为100-200

🚀 快速使用指南

一、🐚 Shell版本操作流程

  1. 修改配置:用vimnano打开脚本,按上述示例调整头部参数(重点核对SOURCE_DIRWEBDAV账号、LOCAL_BACKUP_DIR):

    vim webdav_backup.sh  # 编辑脚本
    # 按「i」进入编辑模式,修改后按「Esc」+输入「:wq」保存退出
  2. 赋予执行权限:首次使用需给脚本添加可执行权限,避免「权限不足」错误:

    chmod +x webdav_backup.sh
  3. 手动执行测试:先手动运行一次,验证配置是否正确(若报错,可根据日志排查问题):

    ./webdav_backup.sh
    # 执行后观察输出
  4. 设置定时任务(自动化备份)
    若需每天凌晨2点自动备份,可通过以下两种方式添加到crontab(Linux/macOS自带定时任务工具):

    • 方式1:手动编辑crontab(适合需要调整其他任务的场景)

      # 1. 打开crontab编辑器
      crontab -e
      # 2. 在末尾添加以下内容(替换实际路径,日志路径需提前创建)
      # 格式说明:分 时 日 月 周 脚本路径 >> 日志路径 2>&1(2>&1=错误日志也写入文件)
      0 2 * * * /path/to/webdav_backup.sh >> /var/log/webdav_backup.log 2>&1
      # 3. 保存退出:vi编辑器按「Esc」+「:wq」,nano按「Ctrl+O」+「Enter」+「Ctrl+X」
    • 方式2:直接命令添加(无需手动编辑,更便捷,适合批量部署)

      # 替换「/path/to/webdav_backup.sh」和「/path/to/backup.log」为实际路径
      (crontab -l 2>/dev/null; echo "0 2 * * * /path/to/webdav_backup.sh >> /path/to/backup.log 2>&1") | crontab -

二、🐍 Python版本操作流程

  1. 安装依赖库:首次使用需安装requests库(用于WebDAV通信),若系统有多个Python版本,建议指定pip3

    # 通用安装命令
    pip install requests
    # 若有Python3和Python2共存,用:
    pip3 install requests
  2. 修改配置:与Shell版本一致,用文本编辑器打开webdav_backup.py,调整头部参数(参数含义完全相同,无需额外适配):

    vim webdav_backup.py
  3. 手动执行测试:运行脚本并验证配置(若报错,优先检查requests是否安装成功、Python版本是否≥3.6):

    # 通用执行命令
    python webdav_backup.py
    # 若指定Python3,用:
    python3 webdav_backup.py
  4. 设置定时任务:与Shell版本逻辑一致,仅需修改「执行命令」和「脚本路径」:

    • 方式1:手动编辑crontab

      crontab -e
      # 添加以下内容(替换实际路径)
      0 2 * * * python3 /path/to/webdav_backup.py >> /var/log/webdav_backup.log 2>&1
    • 方式2:直接命令添加

      # 替换「/path/to/webdav_backup.py」和「/path/to/backup.log」为实际路径
      (crontab -l 2>/dev/null; echo "0 2 * * * python3 /path/to/webdav_backup.py >> /path/to/backup.log 2>&1") | crontab -

🔧 核心功能解析

1. 智能备份与清理机制

  • 时间戳命名:备份文件自动按「前缀_年月日_时分秒.格式」命名(例:server1_backup_20250917_020000.tar.gz),便于追溯备份时间,避免文件名冲突。
  • 双端自动清理

    • 远程清理:当WebDAV上的备份数量超过MAX_REMOTE_BACKUPS时,自动删除最早的备份文件,避免远程空间耗尽。
    • 本地清理:同理,本地备份数量超过MAX_LOCAL_BACKUPS时,自动删除旧备份,释放本地磁盘空间。
  • 格式灵活选择tar.gz压缩率高(节省存储),适合Linux服务器;zip格式跨平台(Windows可直接解压),适合需多系统访问的场景。

2. 大文件优化处理(解决上传痛点)

针对大文件(如数据库备份、视频文件)上传易超时、易中断的问题,脚本做了三重优化:

  1. 动态参数切换:根据文件大小自动选择上传参数(大文件用更长超时、更低速率限制,小文件用更短超时、更高速率,兼顾效率与稳定性)。
  2. 断点续传:基于curl(Shell)和requests(Python)的断点续传能力,若上传中断(如网络波动),再次执行脚本会从已上传部分继续,无需重新上传整个文件,大幅节省时间。
  3. 速率可控:Shell版本支持限制上传速度(如1M/s),避免备份占用全部带宽,影响服务器其他业务(Python版本暂不支持此功能,需后续优化)。

3. 完整性保障体系(避免文件损坏)

为确保上传后的文件与本地一致,脚本提供「大小校验+MD5校验」双重保障:

  1. 文件大小校验:上传完成后,自动对比本地文件与远程文件的大小,若不一致(如上传中断导致文件不完整),则标记为「上传失败」,并删除远程损坏文件,避免无效备份。
  2. MD5校验(可选):启用后,脚本会计算本地文件的MD5值,上传后再计算远程文件的MD5值,两者一致则确认文件完整;同时支持跳过超大文件的MD5校验(通过MD5_VERIFICATION_EXCLUDE_THRESHOLD设置),避免耗时过长。

4. 精准邮件通知(及时知晓结果)

支持按备份结果发送通知,避免无效信息干扰,核心特性:

  • 开关独立控制:可分别开启/关闭「成功通知」和「失败通知」(例:仅接收失败通知,减少冗余信息)。
  • 内容详细完整:邮件包含「备份时间、源目录、备份文件大小、上传状态、耗时、错误信息(若失败)」,便于快速定位问题(如失败时可通过错误信息排查是WebDAV账号错误还是网络问题)。
  • 多邮箱支持:收件人可填写多个邮箱(用逗号分隔),适合团队协作场景(如运维组全员接收备份结果)。

🛠️ 常见问题与解决方案(附排查步骤)

问题1:大文件上传超时或中断

原因排查(按优先级排序)

  1. 上传时间不足(默认2小时,超大文件可能不够);
  2. 网络波动频繁(公网WebDAV易出现);
  3. WebDAV服务器限制单文件大小或上传时间;
  4. 本地磁盘空间不足(备份过程中磁盘满导致文件损坏)。

解决方案

  1. 延长大文件超时时间:将LARGE_FILE_MAX_TIME从7200(2小时)调整为14400(4小时)或21600(6小时);
  2. 关闭大小文件区分:将USE_SEPARATE_FILE_PARAMS设为false,所有文件统一用大文件参数(更稳定);
  3. 检查网络稳定性:在备份时段用ping your-webdav-server.com测试网络延迟,若波动大,建议更换备份时段(如凌晨);
  4. 验证服务器限制:联系WebDAV服务商,确认是否有单文件大小限制(如InfiniCloud免费版通常支持10GB以内文件);
  5. 检查本地磁盘:执行df