Oss纯shell脚本备份

使用shell 脚本通过 curl 备份到Oss 可以备份多个目录地址

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/bin/bash

# 配置参数
HOST="oss-cn-xxx.aliyuncs.com"
BUCKET="BUCKET"
ACCESS_KEY_ID="ACCESS_KEY_ID"
ACCESS_KEY_SECRET="ACCESS_KEY_SECRET"

# 备份函数
backup_and_upload() {

    local SOURCE_DIR="$1"      # 源目录路径
    local SOURCE_NAME="$2"     # 源目录或文件名
    local BACKUP_PREFIX="$3"   # 备份前缀

    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份本地文件:${SOURCE_NAME}"
    # 获取当前小时(两位格式)
    local current_hour=$(date +"%H")
    local FILENAME="backup-${BACKUP_PREFIX}-${current_hour}.tar.gz"
    local FULL_SOURCE_PATH="${SOURCE_DIR}/${FILENAME}"
    local OSS_PATH="backup/${BACKUP_PREFIX}/${FILENAME}"

    # 压缩文件
    tar -zcvf "${FULL_SOURCE_PATH}" -C "${SOURCE_DIR}" "${SOURCE_NAME}"

    # 生成 OSS 签名
    local contentType=$(file -ib "${FULL_SOURCE_PATH}" | awk -F ";" '{print $1}')
    local dateValue=$(TZ=GMT env LANG=en_US.UTF-8 date +'%a, %d %b %Y %H:%M:%S GMT')
    local resource="/${BUCKET}/${OSS_PATH}"
    local stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
    local signature=$(printf "$stringToSign" | openssl dgst -sha1 -hmac "${ACCESS_KEY_SECRET}" -binary | base64)

    # 上传文件
    local response=$(curl -s -w "%{http_code}" -i -q -X PUT -T "${FULL_SOURCE_PATH}" \
        -H "Host: ${BUCKET}.${HOST}" \
        -H "Date: ${dateValue}" \
        -H "Content-Type: ${contentType}" \
        -H "Authorization: OSS ${ACCESS_KEY_ID}:${signature}" \
        "http://${BUCKET}.${HOST}/${OSS_PATH}")

    # 检查上传结果
    local http_code=$(echo "$response" | tail -n1)
    if [ "$http_code" -eq 200 ]; then
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 上传成功:${FILENAME}"
    else
        echo "[$(date '+%Y-%m-%d %H:%M:%S')] 上传失败:${FILENAME},HTTP状态码:${http_code}"
        return 1
    fi
# 删除本地文件
rm "${FULL_SOURCE_PATH}"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 已删除本地文件:${FULL_SOURCE_PATH}"
}

# 主脚本逻辑
main() {
    # 备份 nezha
    backup_and_upload "/opt" "test" "test"

    # 备份其他目录
    backup_and_upload "/root/docker" "other" "other"
}

# 执行主函数
main
0%