linux定期备份并自动上传云端的核心是三步:编写备份脚本→配置rclone云端连接→设置cron定时任务;需确保每步可验证、有日志、路径绝对、权限正确,并包含压缩、错误检查与保留策略。

在 Linux 中实现定期备份并自动上传云端,核心是三步:编写备份脚本 → 配置云端上传(如用 rclone)→ 设置定时任务(cron)。关键不在“写得多复杂”,而在“每一步都稳、可验证、有日志”。
一、准备云端存储并配置 rclone
rclone 是最通用的命令行云同步工具,支持 Google Drive、OneDrive、阿里云 OSS、腾讯 COS、WebDAV 等数十种后端。先安装:
Ubuntu/Debian:
sudo apt update && sudo apt install rclone
CentOS/RHEL:
sudo yum install epel-release && sudo yum install rclone(或用 dnf)
然后运行 rclone config,按向导添加你的云盘(例如选 Google Drive,登录授权,命名远程名如 gdrive)。完成后测试:
rclone ls gdrive:backup-test(列出远程目录)
rclone copy /tmp/test.txt gdrive:backup-test/(上传一个文件验证)
二、编写备份脚本(含压缩、保留策略、错误检查)
把下面内容保存为 /opt/scripts/backup-to-cloud.sh,记得 chmod +x:
#!/bin/bash
# 配置区(按需修改)
SOURCE_DIR="/home/user/docs"
BACKUP_NAME="docs-$(date +\%Y\%m\%d-\%H\%M)"
TEMP_DIR="/tmp/backup"
CLOUD_REMOTE="gdrive:backups"
RETAIN_DAYS=7
LOG_FILE="/var/log/backup.log"
# 创建临时目录
mkdir -p "$TEMP_DIR"
# 打包并压缩(排除临时文件、缓存等)
tar -czf "$TEMP_DIR/${BACKUP_NAME}.tar.gz" \
--exclude='*.tmp' --exclude='cache/' --exclude='.git' \
-C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")" 2>>"$LOG_FILE"
# 检查打包是否成功
if [ $? -ne 0 ]; then
echo "[$(date)] ERROR: tar failed for $SOURCE_DIR" >> "$LOG_FILE"
exit 1
fi
# 上传到云端
rclone copy "$TEMP_DIR/${BACKUP_NAME}.tar.gz" "$CLOUD_REMOTE/" --log-file="$LOG_FILE"
if [ $? -ne 0 ]; then
echo "[$(date)] ERROR: upload failed" >> "$LOG_FILE"
exit 1
fi
# 清理本地临时文件
rm -f "$TEMP_DIR/${BACKUP_NAME}.tar.gz"
# 可选:清理云端超过 RETAIN_DAYS 的旧备份(仅对命名含日期的文件有效)
rclone delete "$CLOUD_REMOTE/" --min-age ${RETAIN_DAYS}d --log-file="$LOG_FILE"
echo "[$(date)] SUCCESS: $BACKUP_NAME uploaded" >> "$LOG_FILE"
三、用 cron 设置定期执行
运行 crontab -e,添加一行(例如每天凌晨 2:30 执行):
30 2 * * * /opt/scripts/backup-to-cloud.sh
注意:
- 脚本中用的路径必须是绝对路径(如 /usr/bin/rclone,可用 which rclone 查);
- cron 默认环境变量精简,可在 crontab 开头加 PATH=/usr/local/bin:/usr/bin:/bin;
- 若 rclone 使用了 OAuth(如 Google Drive),确保认证文件(~/.config/rclone/rclone.conf)对运行 cron 的用户(通常是 root 或你指定的用户)可读。
四、验证与维护建议
- 手动运行一次脚本,检查 /var/log/backup.log 是否有 SUCCESS,再登录云盘确认文件存在
- 首次上传后,改小 RETAIN_DAYS(比如设为 1),测试自动清理是否生效
- 给关键目录加校验:在脚本末尾加 rclone md5sum "$CLOUD_REMOTE/${BACKUP_NAME}.tar.gz" | grep -q "$(md5sum "$TEMP_DIR/${BACKUP_NAME}.tar.gz" | cut -d' ' -f1)",比对一致性
- 重要数据建议启用 rclone 的 --dry-run 先试跑 cron,确认命令逻辑无误











