本文目录导读:

这里介绍几种常见的通过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通常集成度更好、功能更全。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播