本文目录导读:

这里介绍几种常见的通过Shell脚本同步本地文件到云存储的方法,我会涵盖主流云服务(阿里云OSS、AWS S3、腾讯云COS)以及通用方案。
通用方案:使用Rclone
Rclone 支持几乎所有主流云存储,是最推荐的通用工具。
安装 Rclone
# Linux curl https://rclone.org/install.sh | sudo bash # macOS brew install rclone
配置 Rclone
# 交互式配置(按提示选择云存储并输入密钥) rclone config
同步脚本示例
#!/bin/bash # 配置变量 LOCAL_PATH="/path/to/local/folder" REMOTE_PATH="remote_name:bucket-name/folder" LOG_FILE="/var/log/sync.log" # 使用 rclone sync 进行同步(目标端会完全匹配源端) rclone sync "$LOCAL_PATH" "$REMOTE_PATH" \ --progress \ --log-file="$LOG_FILE" \ --log-level=INFO \ --delete-excluded \ --exclude="*.tmp" \ --exclude="node_modules/**" # 或者使用 copy(只上传新增/修改的文件,不删除目标端多余文件) # rclone copy "$LOCAL_PATH" "$REMOTE_PATH" --progress --log-file="$LOG_FILE"
阿里云OSS
使用官方工具 ossutil。
安装与配置
# 安装 ossutil curl -o ossutil https://ossutil.oss-cn-hangzhou.aliyuncs.com/ossutil-v2.0.2-linux-amd64.zip unzip ossutil && chmod +x ossutil # 配置(交互式输入AK/Secret) ./ossutil config
同步脚本
#!/bin/bash LOCAL_DIR="/data/backup" OSS_BUCKET="oss://my-bucket/backup/" OSS_CONFIG_FILE="/root/.ossutilconfig" # 同步到OSS(增量同步) ossutil sync "$LOCAL_DIR" "$OSS_BUCKET" \ --config-file="$OSS_CONFIG_FILE" \ --delete \ --update \ --exclude "*.log" \ --retry-times=3 # 输出结果 if [ $? -eq 0 ]; then echo "[$(date)] 同步成功" >> /var/log/oss-sync.log else echo "[$(date)] 同步失败" >> /var/log/oss-sync.log fi
AWS S3
使用官方 AWS CLI。
安装与配置
# 安装 AWS CLI pip install awscli # 或者用包管理器 # apt-get install awscli (Ubuntu) # yum install awscli (CentOS) # 配置凭证 aws configure # 输入 Access Key ID, Secret Access Key, Region
同步脚本
#!/bin/bash LOCAL_DIR="/var/www/html" S3_BUCKET="s3://my-website-backup/html" AWS_PROFILE="default" # 同步到 S3 aws s3 sync "$LOCAL_DIR" "$S3_BUCKET" \ --profile "$AWS_PROFILE" \ --delete \ --exclude ".git/*" \ --exclude "*.swp" \ --region cn-north-1 \ --acl private # 或者只上传新增文件(不删除远程) # aws s3 cp "$LOCAL_DIR" "$S3_BUCKET" --recursive
腾讯云COS
使用 coscli 工具。
安装与配置
# 下载 coscli wget https://github.com/tencentyun/coscli/releases/latest/download/coscli-linux mv coscli-linux coscli chmod +x coscli # 配置 ./coscli config -a <SecretId> -s <SecretKey> -b <BucketName> -r <Region>
同步脚本
#!/bin/bash LOCAL_DIR="/data/database_backup" COS_BUCKET="cos://my-bucket/backup/" COS_CONFIG="/root/.cos.yaml" # 同步到COS ./coscli sync "$LOCAL_DIR" "$COS_BUCKET" \ --config-file="$COS_CONFIG" \ --delete \ --exclude "*.bak" \ --part-size=32 echo "[$(date)] COS同步完成" >> /var/log/cos-sync.log
定时任务自动化
使用 crontab 定期执行同步脚本。
设置 crontab
# 编辑定时任务 crontab -e # 每天凌晨2点同步 0 2 * * * /path/to/sync-script.sh # 每3小时同步一次 0 */3 * * * /path/to/sync-script.sh # 每30分钟同步一次 */30 * * * * /path/to/sync-script.sh
完整的同步脚本模板
这是一个更完整、带有错误处理和通知的同步脚本:
#!/bin/bash
# ========== 配置区域 ==========
LOCAL_PATH="/data/important"
CLOUD_PATH="s3://backup-bucket/data"
LOG_FILE="/var/log/cloud-sync.log"
NOTIFY_EMAIL="admin@example.com"
MAX_RETRIES=3
# ==============================
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 错误处理
handle_error() {
log "错误: $1"
echo "备份同步失败: $1" | mail -s "[Alert] 云同步失败" "$NOTIFY_EMAIL"
exit 1
}
# 检查依赖
if ! command -v rclone &> /dev/null; then
handle_error "rclone 未安装"
fi
# 检查本地路径
if [ ! -d "$LOCAL_PATH" ]; then
handle_error "本地路径不存在: $LOCAL_PATH"
fi
log "开始同步: $LOCAL_PATH -> $CLOUD_PATH"
# 执行同步(带重试)
for i in $(seq 1 $MAX_RETRIES); do
log "第 $i 次尝试同步..."
if rclone sync "$LOCAL_PATH" "$CLOUD_PATH" \
--verbose \
--log-file="$LOG_FILE" \
--stats=10s \
2>&1; then
log "同步成功完成"
# 可选:同步完成后验证
log "验证同步结果..."
rclone check "$LOCAL_PATH" "$CLOUD_PATH" --one-way
exit 0
else
log "第 $i 次同步失败"
sleep 10 # 等待10秒后重试
fi
done
handle_error "所有重试均失败"
注意事项
- 权限管理:不要在脚本中硬编码密钥,使用环境变量或专用的凭证文件
- 增量同步:大多数工具支持增量同步,每次只传输变化的部分
- 排除文件:使用
--exclude跳过临时文件、缓存等 - 日志记录:记录每次同步的结果,便于排查问题
- 网络检测:如果网络不稳定,可以增加重试机制
- 备份策略:考虑 3-2-1 备份原则(3份备份、2种介质、1份异地)
选择哪种方案取决于你使用的云服务商,如果希望统一管理多个云服务,Rclone 是最佳选择;如果只使用单一云服务,使用官方CLI通常集成度更好、功能更全。