高效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+
以支持断点续传) - 内置库:
smtplib
、email
(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_URL | https://dav.example.com/ | 末尾可带/或不带,脚本会自动兼容,但建议统一格式(如不带/) |
SMTP_PASSWORD | 用QQ邮箱登录密码 | 需用QQ邮箱「独立授权码」(在邮箱设置-账户中开启) |
MD5_VERIFICATION_EXCLUDE_THRESHOLD | 设为0 | 0=所有文件校验,大文件会耗时,建议设为100-200 |
🚀 快速使用指南
一、🐚 Shell版本操作流程
修改配置:用
vim
或nano
打开脚本,按上述示例调整头部参数(重点核对SOURCE_DIR
、WEBDAV
账号、LOCAL_BACKUP_DIR
):vim webdav_backup.sh # 编辑脚本 # 按「i」进入编辑模式,修改后按「Esc」+输入「:wq」保存退出
赋予执行权限:首次使用需给脚本添加可执行权限,避免「权限不足」错误:
chmod +x webdav_backup.sh
手动执行测试:先手动运行一次,验证配置是否正确(若报错,可根据日志排查问题):
./webdav_backup.sh # 执行后观察输出
设置定时任务(自动化备份):
若需每天凌晨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版本操作流程
安装依赖库:首次使用需安装
requests
库(用于WebDAV通信),若系统有多个Python版本,建议指定pip3
:# 通用安装命令 pip install requests # 若有Python3和Python2共存,用: pip3 install requests
修改配置:与Shell版本一致,用文本编辑器打开
webdav_backup.py
,调整头部参数(参数含义完全相同,无需额外适配):vim webdav_backup.py
手动执行测试:运行脚本并验证配置(若报错,优先检查
requests
是否安装成功、Python版本是否≥3.6):# 通用执行命令 python webdav_backup.py # 若指定Python3,用: python3 webdav_backup.py
设置定时任务:与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
时,自动删除旧备份,释放本地磁盘空间。
- 远程清理:当WebDAV上的备份数量超过
- 格式灵活选择:
tar.gz
压缩率高(节省存储),适合Linux服务器;zip
格式跨平台(Windows可直接解压),适合需多系统访问的场景。
2. 大文件优化处理(解决上传痛点)
针对大文件(如数据库备份、视频文件)上传易超时、易中断的问题,脚本做了三重优化:
- 动态参数切换:根据文件大小自动选择上传参数(大文件用更长超时、更低速率限制,小文件用更短超时、更高速率,兼顾效率与稳定性)。
- 断点续传:基于
curl
(Shell)和requests
(Python)的断点续传能力,若上传中断(如网络波动),再次执行脚本会从已上传部分继续,无需重新上传整个文件,大幅节省时间。 - 速率可控:Shell版本支持限制上传速度(如
1M/s
),避免备份占用全部带宽,影响服务器其他业务(Python版本暂不支持此功能,需后续优化)。
3. 完整性保障体系(避免文件损坏)
为确保上传后的文件与本地一致,脚本提供「大小校验+MD5校验」双重保障:
- 文件大小校验:上传完成后,自动对比本地文件与远程文件的大小,若不一致(如上传中断导致文件不完整),则标记为「上传失败」,并删除远程损坏文件,避免无效备份。
- MD5校验(可选):启用后,脚本会计算本地文件的MD5值,上传后再计算远程文件的MD5值,两者一致则确认文件完整;同时支持跳过超大文件的MD5校验(通过
MD5_VERIFICATION_EXCLUDE_THRESHOLD
设置),避免耗时过长。
4. 精准邮件通知(及时知晓结果)
支持按备份结果发送通知,避免无效信息干扰,核心特性:
- 开关独立控制:可分别开启/关闭「成功通知」和「失败通知」(例:仅接收失败通知,减少冗余信息)。
- 内容详细完整:邮件包含「备份时间、源目录、备份文件大小、上传状态、耗时、错误信息(若失败)」,便于快速定位问题(如失败时可通过错误信息排查是WebDAV账号错误还是网络问题)。
- 多邮箱支持:收件人可填写多个邮箱(用逗号分隔),适合团队协作场景(如运维组全员接收备份结果)。
🛠️ 常见问题与解决方案(附排查步骤)
问题1:大文件上传超时或中断
原因排查(按优先级排序)
- 上传时间不足(默认2小时,超大文件可能不够);
- 网络波动频繁(公网WebDAV易出现);
- WebDAV服务器限制单文件大小或上传时间;
- 本地磁盘空间不足(备份过程中磁盘满导致文件损坏)。
解决方案
- 延长大文件超时时间:将
LARGE_FILE_MAX_TIME
从7200(2小时)调整为14400(4小时)或21600(6小时); - 关闭大小文件区分:将
USE_SEPARATE_FILE_PARAMS
设为false
,所有文件统一用大文件参数(更稳定); - 检查网络稳定性:在备份时段用
ping your-webdav-server.com
测试网络延迟,若波动大,建议更换备份时段(如凌晨); - 验证服务器限制:联系WebDAV服务商,确认是否有单文件大小限制(如InfiniCloud免费版通常支持10GB以内文件);
- 检查本地磁盘:执行
df
评论区(暂无评论)