From 553ed9035b8bcdfb9f16af060fbe217d2279c66c Mon Sep 17 00:00:00 2001 From: xzx3344521 Date: Sun, 2 Nov 2025 23:44:51 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E8=AF=95=E9=AA=8C=E7=94=A8=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 试验用脚本 | 392 +++++++++++++++++++++++++++++------------------------ 1 file changed, 218 insertions(+), 174 deletions(-) diff --git a/试验用脚本 b/试验用脚本 index 377e547..a5cb89f 100644 --- a/试验用脚本 +++ b/试验用脚本 @@ -1,155 +1,170 @@ -cat > auto-config-r2.sh << 'EOF' +cat > r2-auto-setup.sh << 'EOF' #!/bin/bash -# Cloudflare R2 自动配置脚本 -echo "========================================" -echo " Cloudflare R2 自动配置脚本" -echo "========================================" +# Cloudflare R2 一键配置脚本 +R2_SETUP_VERSION="1.0" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' -NC='\033[0m' # No Color +BLUE='\033[0;34m' +NC='\033[0m' -# 检查 rclone 是否安装 -check_rclone() { - if ! command -v rclone &> /dev/null; then - echo -e "${RED}错误: rclone 未安装${NC}" - echo "正在安装 rclone..." - curl -s https://rclone.org/install.sh | sudo bash > /dev/null 2>&1 - if [ $? -ne 0 ]; then - echo -e "${RED}rclone 安装失败${NC}" - exit 1 - fi - fi - echo -e "${GREEN}✓ rclone 已安装${NC}" +# 日志函数 +log() { + echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } -# 显示配置说明 -show_instructions() { - echo - echo -e "${YELLOW}配置说明:${NC}" - echo "1. 登录 Cloudflare 控制台 (https://dash.cloudflare.com)" - echo "2. 进入 R2 → 你的存储桶" - echo "3. 在 'R2 API' 部分找到以下信息:" - echo " - Account ID" - echo " - Access Key ID" - echo " - Secret Access Key" - echo "4. 准备好这些信息后继续" - echo +warn() { + echo -e "${YELLOW}[警告]${NC} $1" +} + +error() { + echo -e "${RED}[错误]${NC} $1" +} + +info() { + echo -e "${BLUE}[信息]${NC} $1" +} + +# 显示横幅 +show_banner() { + clear + echo -e "${GREEN}" + echo "================================================" + echo " Cloudflare R2 一键配置脚本 v$R2_SETUP_VERSION" + echo "================================================" + echo -e "${NC}" +} + +# 检查系统 +check_system() { + log "检查系统环境..." + + # 检查 curl + if ! command -v curl &> /dev/null; then + error "curl 未安装,正在安装..." + apt-get update && apt-get install -y curl || yum install -y curl + fi + + # 检查 unzip + if ! command -v unzip &> /dev/null; then + warn "unzip 未安装,正在安装..." + apt-get install -y unzip || yum install -y unzip + fi +} + +# 安装 rclone +install_rclone() { + if command -v rclone &> /dev/null; then + log "rclone 已安装,版本: $(rclone version | head -1)" + return 0 + fi + + log "安装 rclone..." + curl -s https://rclone.org/install.sh | sudo bash > /dev/null 2>&1 + + if command -v rclone &> /dev/null; then + log "✓ rclone 安装成功" + else + error "rclone 安装失败" + exit 1 + fi } # 获取用户输入 get_user_input() { - echo -e "${YELLOW}请输入 Cloudflare R2 配置信息:${NC}" + echo + info "请提供 Cloudflare R2 配置信息:" + echo - read -p "请输入远程配置名称 [默认: r2-storage]: " REMOTE_NAME + read -p "请输入配置名称 [默认: r2-storage]: " REMOTE_NAME REMOTE_NAME=${REMOTE_NAME:-r2-storage} read -p "请输入 Account ID: " ACCOUNT_ID while [ -z "$ACCOUNT_ID" ]; do - echo -e "${RED}Account ID 不能为空${NC}" + error "Account ID 不能为空" read -p "请输入 Account ID: " ACCOUNT_ID done read -p "请输入 Access Key ID: " ACCESS_KEY while [ -z "$ACCESS_KEY" ]; do - echo -e "${RED}Access Key ID 不能为空${NC}" + error "Access Key ID 不能为空" read -p "请输入 Access Key ID: " ACCESS_KEY done read -p "请输入 Secret Access Key: " SECRET_KEY while [ -z "$SECRET_KEY" ]; do - echo -e "${RED}Secret Access Key 不能为空${NC}" + error "Secret Access Key 不能为空" read -p "请输入 Secret Access Key: " SECRET_KEY done read -p "请输入存储桶名称: " BUCKET_NAME while [ -z "$BUCKET_NAME" ]; do - echo -e "${RED}存储桶名称不能为空${NC}" + error "存储桶名称不能为空" read -p "请输入存储桶名称: " BUCKET_NAME done - # 构建 endpoint ENDPOINT="https://${ACCOUNT_ID}.r2.cloudflarestorage.com" } -# 自动配置 rclone -configure_rclone() { - echo - echo -e "${YELLOW}正在配置 rclone...${NC}" +# 配置 R2 +configure_r2() { + log "配置 Cloudflare R2..." - # 使用 rclone config create 非交互式创建 + # 删除已存在的配置 + rclone config delete "$REMOTE_NAME" --quiet > /dev/null 2>&1 + + # 创建新配置 rclone config create "$REMOTE_NAME" s3 \ - provider "Other" \ + provider Cloudflare \ access_key_id "$ACCESS_KEY" \ secret_access_key "$SECRET_KEY" \ endpoint "$ENDPOINT" \ - region "auto" \ - acl "private" \ + region auto \ + acl private \ --non-interactive if [ $? -eq 0 ]; then - echo -e "${GREEN}✓ rclone 配置成功${NC}" - echo -e "配置名称: ${YELLOW}$REMOTE_NAME${NC}" + log "✓ R2 配置成功" else - echo -e "${RED}✗ rclone 配置失败${NC}" - echo "尝试交互式配置..." - interactive_configure + error "R2 配置失败" + return 1 fi } -# 交互式配置备用方案 -interactive_configure() { - echo - echo -e "${YELLOW}开始交互式配置...${NC}" - echo "请按照提示手动输入配置信息:" - echo - rclone config -} - # 测试配置 test_configuration() { - echo - echo -e "${YELLOW}正在测试配置...${NC}" + log "测试 R2 连接..." - # 测试列出存储桶 - echo "1. 测试连接性..." - if rclone lsd "$REMOTE_NAME": 2>/dev/null; then - echo -e "${GREEN}✓ 连接测试成功${NC}" - else - echo -e "${YELLOW}⚠ 无法列出所有存储桶,尝试访问指定存储桶...${NC}" + # 测试存储桶访问 + if rclone lsd "$REMOTE_NAME":"$BUCKET_NAME" > /dev/null 2>&1; then + log "✓ 存储桶访问测试成功" + return 0 fi - # 测试访问指定存储桶 - echo "2. 测试存储桶访问..." - if rclone lsd "$REMOTE_NAME":"$BUCKET_NAME" 2>/dev/null; then - echo -e "${GREEN}✓ 存储桶访问测试成功${NC}" + # 尝试创建测试目录 + warn "存储桶访问失败,尝试创建测试目录..." + if rclone mkdir "$REMOTE_NAME":"$BUCKET_NAME"/r2-test > /dev/null 2>&1; then + log "✓ 目录创建测试成功" + rclone rmdir "$REMOTE_NAME":"$BUCKET_NAME"/r2-test > /dev/null 2>&1 return 0 else - # 尝试创建目录测试 - echo "3. 创建测试目录..." - if rclone mkdir "$REMOTE_NAME":"$BUCKET_NAME"/test-connection 2>/dev/null; then - echo -e "${GREEN}✓ 目录创建测试成功${NC}" - # 清理测试目录 - rclone rmdir "$REMOTE_NAME":"$BUCKET_NAME"/test-connection 2>/dev/null - return 0 - else - echo -e "${RED}✗ 配置测试失败${NC}" - echo -e "${YELLOW}可能的原因:${NC}" - echo " - API 密钥不正确" - echo " - 存储桶名称错误" - echo " - API 令牌权限不足" - echo " - 网络连接问题" - return 1 - fi + error "配置测试失败" + warn "请检查:" + warn "1. 存储桶名称是否正确" + warn "2. API 密钥权限是否足够" + warn "3. 网络连接是否正常" + return 1 fi } # 创建管理脚本 create_management_scripts() { - # 创建备份脚本 + log "创建管理脚本..." + + # 备份脚本 cat > r2-backup.sh << 'SCRIPTEOF' #!/bin/bash # Cloudflare R2 自动备份脚本 @@ -160,158 +175,187 @@ BACKUP_SOURCE="${2:-/opt/1panel}" BACKUP_PREFIX="backup" DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="/tmp/${BACKUP_PREFIX}_${DATE}.tar.gz" +LOG_FILE="/var/log/r2-backup.log" -echo "[$(date)] 开始备份到 Cloudflare R2" -echo "备份源: $BACKUP_SOURCE" -echo "目标: $REMOTE:$BUCKET/backups/" +log() { + echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" + echo "$1" +} + +log "开始备份到 Cloudflare R2" # 检查源目录 if [ ! -d "$BACKUP_SOURCE" ]; then - echo "错误: 源目录不存在: $BACKUP_SOURCE" + log "错误: 源目录不存在: $BACKUP_SOURCE" exit 1 fi # 创建备份 -echo "创建备份文件..." +log "创建备份文件: $BACKUP_FILE" tar -czf "$BACKUP_FILE" -C "$BACKUP_SOURCE" . 2>/dev/null if [ $? -ne 0 ]; then - echo "错误: 备份文件创建失败" + log "错误: 备份文件创建失败" exit 1 fi # 上传到 R2 -echo "上传到 Cloudflare R2..." +log "上传到 Cloudflare R2..." rclone copy "$BACKUP_FILE" "$REMOTE:$BUCKET/backups/" if [ $? -eq 0 ]; then - echo "✓ 备份成功: ${BACKUP_PREFIX}_${DATE}.tar.gz" - - # 清理本地备份文件 + log "✓ 备份成功: ${BACKUP_PREFIX}_${DATE}.tar.gz" rm -f "$BACKUP_FILE" - - # 显示备份信息 - echo "备份位置: $REMOTE:$BUCKET/backups/${BACKUP_PREFIX}_${DATE}.tar.gz" - echo "文件大小: $(du -h "$BACKUP_FILE" 2>/dev/null | cut -f1) (压缩后)" else - echo "错误: 上传到 R2 失败" + log "错误: 上传到 R2 失败" exit 1 fi -echo "[$(date)] 备份完成" +log "备份完成" SCRIPTEOF - # 创建管理脚本 + # 管理脚本 cat > r2-manage.sh << 'MANAGEEOF' #!/bin/bash -# Cloudflare R2 管理脚本 REMOTE="r2-storage" -BUCKET="${1:-default-bucket}" +BUCKET="${1}" +COMMAND="${2}" +ARG1="${3}" +ARG2="${4}" -case "$2" in +show_help() { + echo "Cloudflare R2 管理脚本" + echo "用法: $0 <存储桶> <命令> [参数]" + echo + echo "命令:" + echo " list 列出存储桶内容" + echo " ls 列出所有文件" + echo " size 显示存储桶大小" + echo " mkdir <目录名> 创建目录" + echo " upload <文件> [路径] 上传文件" + echo " download <文件> [路径] 下载文件" + echo " delete <文件> 删除文件" + echo " sync <本地路径> 同步目录" + echo + echo "示例:" + echo " $0 my-bucket list" + echo " $0 my-bucket upload file.txt" + echo " $0 my-bucket mkdir backups" +} + +if [ -z "$BUCKET" ] || [ -z "$COMMAND" ]; then + show_help + exit 1 +fi + +case "$COMMAND" in "list") - echo "列出存储桶内容:" rclone lsd "$REMOTE:$BUCKET" ;; "ls") - echo "列出详细文件:" rclone ls "$REMOTE:$BUCKET" ;; + "size") + rclone size "$REMOTE:$BUCKET" + ;; "mkdir") - if [ -z "$3" ]; then - echo "用法: $0 mkdir <目录名>" + if [ -z "$ARG1" ]; then + echo "错误: 请指定目录名" exit 1 fi - echo "创建目录: $3" - rclone mkdir "$REMOTE:$BUCKET/$3" + rclone mkdir "$REMOTE:$BUCKET/$ARG1" ;; "upload") - if [ -z "$3" ]; then - echo "用法: $0 upload <本地文件> [远程路径]" + if [ -z "$ARG1" ]; then + echo "错误: 请指定要上传的文件" exit 1 fi - REMOTE_PATH="${4:-/}" - echo "上传文件: $3 → $REMOTE:$BUCKET$REMOTE_PATH" - rclone copy "$3" "$REMOTE:$BUCKET$REMOTE_PATH" + REMOTE_PATH="${ARG2:-/}" + rclone copy "$ARG1" "$REMOTE:$BUCKET$REMOTE_PATH" ;; "download") - if [ -z "$3" ]; then - echo "用法: $0 download <远程文件> [本地路径]" + if [ -z "$ARG1" ]; then + echo "错误: 请指定要下载的文件" exit 1 fi - LOCAL_PATH="${4:-./}" - echo "下载文件: $REMOTE:$BUCKET/$3 → $LOCAL_PATH" - rclone copy "$REMOTE:$BUCKET/$3" "$LOCAL_PATH" + LOCAL_PATH="${ARG2:-./}" + rclone copy "$REMOTE:$BUCKET/$ARG1" "$LOCAL_PATH" + ;; + "delete") + if [ -z "$ARG1" ]; then + echo "错误: 请指定要删除的文件" + exit 1 + fi + rclone delete "$REMOTE:$BUCKET/$ARG1" + ;; + "sync") + if [ -z "$ARG1" ]; then + echo "错误: 请指定本地路径" + exit 1 + fi + rclone sync "$ARG1" "$REMOTE:$BUCKET/" ;; *) - echo "Cloudflare R2 管理脚本" - echo "用法: $0 <存储桶名称> <命令> [参数]" - echo "" - echo "命令:" - echo " list 列出存储桶内容" - echo " ls 列出所有文件" - echo " mkdir <目录名> 创建目录" - echo " upload <文件> [路径] 上传文件" - echo " download <文件> [路径] 下载文件" - echo "" - echo "示例:" - echo " $0 my-bucket list" - echo " $0 my-bucket upload backup.tar.gz" - echo " $0 my-bucket mkdir backups" + show_help ;; esac MANAGEEOF - chmod +x r2-backup.sh r2-manage.sh - echo -e "${GREEN}✓ 管理脚本已创建${NC}" + # 快速测试脚本 + cat > r2-test.sh << 'TESTEOF' +#!/bin/bash +echo "测试 Cloudflare R2 连接..." +rclone lsd r2-storage: +echo +echo "测试完成" +TESTEOF + + chmod +x r2-backup.sh r2-manage.sh r2-test.sh + log "✓ 管理脚本创建完成" } -# 显示使用说明 -show_usage() { +# 显示完成信息 +show_success() { echo - echo -e "${GREEN}========================================" - echo " 配置完成!" + echo -e "${GREEN}" echo "========================================" - echo - echo -e "远程配置名称: ${YELLOW}$REMOTE_NAME${NC}" - echo -e "存储桶名称: ${YELLOW}$BUCKET_NAME${NC}" - echo -e "Endpoint: ${YELLOW}$ENDPOINT${NC}" - echo - echo -e "${GREEN}常用命令:${NC}" - echo "列出存储桶: ${YELLOW}rclone lsd $REMOTE_NAME:${NC}" - echo "列出文件: ${YELLOW}rclone ls $REMOTE_NAME:$BUCKET_NAME${NC}" - echo "创建目录: ${YELLOW}rclone mkdir $REMOTE_NAME:$BUCKET_NAME/目录名${NC}" - echo "上传文件: ${YELLOW}rclone copy 文件.txt $REMOTE_NAME:$BUCKET_NAME/${NC}" - echo "下载文件: ${YELLOW}rclone copy $REMOTE_NAME:$BUCKET_NAME/文件.txt ./${NC}" - echo - echo -e "${GREEN}使用管理脚本:${NC}" - echo "自动备份: ${YELLOW}./r2-backup.sh${NC}" - echo "管理存储桶: ${YELLOW}./r2-manage.sh $BUCKET_NAME list${NC}" - echo - echo -e "${YELLOW}安全提醒: 请妥善保管你的 API 密钥!${NC}" + echo " 配置完成!" echo "========================================" + echo -e "${NC}" + echo + info "配置信息:" + echo " - 远程名称: $REMOTE_NAME" + echo " - 存储桶: $BUCKET_NAME" + echo " - Endpoint: $ENDPOINT" + echo + info "可用命令:" + echo " rclone lsd $REMOTE_NAME: 列出存储桶" + echo " rclone ls $REMOTE_NAME:$BUCKET_NAME 列出文件" + echo " ./r2-backup.sh 自动备份" + echo " ./r2-manage.sh $BUCKET_NAME list 管理存储桶" + echo " ./r2-test.sh 快速测试" + echo + warn "安全提醒: 请妥善保管 API 密钥!" + echo } # 主函数 main() { - check_rclone - show_instructions + show_banner + check_system + install_rclone get_user_input - configure_rclone - if test_configuration; then + if configure_r2 && test_configuration; then create_management_scripts - show_usage + show_success else - echo -e "${RED}配置测试失败,请检查输入的信息${NC}" - echo "你可以手动运行: rclone config" + error "配置失败,请检查输入信息" + exit 1 fi } # 运行主函数 -main +main "$@" EOF -# 给脚本执行权限 -chmod +x auto-config-r2.sh - -echo "自动配置脚本已创建: auto-config-r2.sh" -echo "运行命令开始配置: ./auto-config-r2.sh" +# 给脚本执行权限并运行 +chmod +x r2-auto-setup.sh && ./r2-auto-setup.sh