使用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
|