华为云obs备份自动化监控与邮件通知配置教程(一键脚本)

序言

  本教程旨在帮助用户快速部署华为云OBS备份监控工具,实现自动化检查OBS存储桶备份状态,并通过邮件接收检查报告。提供一键安装一键卸载功能,简化运维操作,确保数据备份可靠性。

核心功能
✅ 自动检查OBS备份状态
✅ 支持HTML格式邮件通知
✅ 一键安装/卸载,方便管理

适用于运维人员、开发者及企业数据管理场景。

一、工具安装与配置

1. 下载和安装obsutil

华为云官方提供了obsutil工具用于管理对象存储服务,可以通过以下方式安装:

# 手工安装
wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz
tar -zxvf obsutil_linux_amd64.tar.gz 
cd obsutil_linux_amd64*
# 查看版本
./obsutil version

2. 一键安装脚本

为简化安装过程,可以使用以下一键安装脚本,主要完成以下任务:

  • 安装obsutil工具
  • 配置AK/SK与Endpoint(支持交互)
  • 创建命令行软链接,可直接使用obsutil命令
  • 检查OBS连通性

3、仓库地址:

https://gitee.com/cncsrf/huawei-obs-backup-monitor

4、install_obsutil.sh 一键脚本

#!/bin/bash
# 安装并配置华为云 obsutil 工具(重命名解压目录为固定路径,确保稳定调用)

INSTALL_BASE="/usr/local/bin/obsutil"
STABLE_DIR="${INSTALL_BASE}/stable"
BIN_LINK="/usr/bin/obsutil"

# 颜色定义
YELLOW="\033[1;33m"
GREEN="\033[1;32m"
BLUE="\033[1;34m"
CYAN="\033[1;36m"
RED="\033[1;31m"
RESET="\033[0m"

echo -e "${BLUE}=====================================${RESET}"
echo -e "${CYAN}🌐 华为云 OBS 备份检查工具一键安装脚本${RESET}"
echo -e "${BLUE}-------------------------------------${RESET}"
echo -e "${YELLOW}本工具适用于CentOS7,将完成以下任务:${RESET}"
echo -e "${GREEN}1.${RESET} 安装 obsutil 工具"
echo -e "${GREEN}2.${RESET} 配置 AK/SK 与 Endpoint(支持交互)"
echo -e "${GREEN}3.${RESET} 创建命令行软链接,可直接使用 ${CYAN}obsutil${RESET} 命令"
echo -e "${GREEN}4.${RESET} 检查 OBS 连通性"
echo -e "${BLUE}=====================================${RESET}\n"

# 安装 sendmail(如未安装)
if ! command -v sendmail &> /dev/null; then
    echo -e "${YELLOW}📦 安装 sendmail...${RESET}"
    yum install -y mailx sendmail
fi

# 创建安装目录
mkdir -p "$INSTALL_BASE"
cd "$INSTALL_BASE" || exit 1

# 下载并解压 obsutil
echo -e "${CYAN}📥 正在下载 obsutil...${RESET}"
wget -q https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz
tar -xzf obsutil_linux_amd64.tar.gz
rm -f obsutil_linux_amd64.tar.gz

# 找到解压目录并重命名为 stable(不带版本号)
EXTRACTED_DIR=$(find . -maxdepth 1 -type d -name "obsutil_linux_amd64_*" | head -n 1)
if [ -d "$EXTRACTED_DIR" ]; then
    rm -rf "$STABLE_DIR"
    mv "$EXTRACTED_DIR" "$STABLE_DIR"
else
    echo -e "${RED}❌ 解压失败,未找到 obsutil 目录${RESET}"
    exit 1
fi

# 添加权限并软链接 obsutil 命令
chmod +x "$STABLE_DIR/obsutil"
ln -sf "$STABLE_DIR/obsutil" "$BIN_LINK"

# 显示版本
echo -e "\n${GREEN}✅ obsutil 安装成功,当前版本:${RESET}"
obsutil version

# 交互式配置 obsutil
read -p "请输入 AccessKey(AK): " ak
read -p "请输入 SecretKey(SK): " sk
read -p "请输入 Endpoint(默认: obs.cn-east-3.myhuaweicloud.com): " endpoint
endpoint=${endpoint:-obs.cn-east-3.myhuaweicloud.com}

echo -e "\n🛠 正在配置 obsutil..."
obsutil config -i="$ak" -k="$sk" -e="$endpoint"

# 检查连通性
echo -e "\n${CYAN}🔍 正在检查 OBS 连通性...${RESET}"
echo -e "${YELLOW}如果连接正常,将显示您的 OBS 存储桶列表:${RESET}\n"

if result=$(obsutil ls -s 2>&1); then
    echo -e "${GREEN}✅ 连通性检查成功!${RESET}\n"
    echo "$result"
else
    echo -e "${RED}❌ 连通性检查失败!${RESET}"
    echo -e "${YELLOW}错误信息:${RESET}"
    echo "$result"
    echo -e "\n${YELLOW}请检查以下配置:${RESET}"
    echo "1. AK/SK 是否正确"
    echo "2. Endpoint 是否配置正确"
    echo "3. 网络连接是否正常"
    exit 1
fi

echo -e "\n${GREEN}✅ 配置完成,你现在可以使用 ${CYAN}obsutil${GREEN} 命令上传、下载和检查对象存储中的文件。${RESET}"

二、备份检查脚本

1. 脚本功能说明

本脚本用于每日检查华为云OBS备份情况,主要功能包括:

  • 检查指定OBS桶中最近12小时内新增/变更的文件
  • 验证备份文件总大小是否达到预期(默认1MB)
  • 生成HTML格式的邮件报告
  • 支持三种状态通知:
    • ✅ 成功:备份验证通过
    • ⚠️ 警告:备份文件总大小不足
    • ❌ 错误:无新备份文件或连接失败
 
  • 📧 示例邮件展示效果:
    • ✅ 成功:绿色标题 + 文件表格
    • ⚠️ 大小不足:橙色标题 + 表格
    • ❌ 备份:红色警示 + 简洁说明
 

2. 脚本代码

HTML 邮件脚本(check_obs_backup.sh
#!/bin/bash
# 华为云 OBS 备份检查脚本(HTML 邮件版)- 12小时检查窗口版

# 配置部分
BUCKET_NAME="cnsec"
EMAIL_TO="user@163.com"
EMAIL_FROM="backup-monitor@$(hostname)"
EMAIL_REPLY_TO="noreply@$(hostname)"
MIN_SIZE=$((1*1024*1024))  # 1MB
LOG_FILE="/var/log/obs_backup_check.log"
OBSUTIL_BIN="/usr/local/bin/obsutil/stable/obsutil"
TODAY=$(date +%Y-%m-%d)
START_TIME=$(date +%s)
CHECK_WINDOW_HOURS=12  # 固定12小时检查窗口

# 初始化日志
init_log() {
    echo "==============================================" >> "$LOG_FILE"
    echo "OBS 备份检查开始于: $(date +'%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
    echo "检查时间窗口: 最近${CHECK_WINDOW_HOURS}小时" >> "$LOG_FILE"
    echo "----------------------------------------------" >> "$LOG_FILE"
}

# 记录日志
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 发送邮件
send_email() {
    local subject=$1
    local html_body=$2

    {
        echo "From: $EMAIL_FROM"
        echo "To: $EMAIL_TO"
        echo "Reply-To: $EMAIL_REPLY_TO"
        echo "Subject: $subject"
        echo "MIME-Version: 1.0"
        echo "Content-Type: text/html; charset=UTF-8"
        echo "X-Mailer: OBS Backup Monitor/1.0"
        echo ""
        echo "$html_body"
    } | sendmail -t -f "$EMAIL_FROM"

    if [ $? -eq 0 ]; then
        log "HTML 邮件已成功发送至 $EMAIL_TO"
    else
        log "错误:邮件发送失败"
    fi
}

# 转换大小为字节
convert_size_to_bytes() {
    local size_str=$1
    if [[ $size_str == *MB ]]; then
        awk "BEGIN {printf \"%.0f\", ${size_str%MB} * 1024 * 1024}"
    elif [[ $size_str == *KB ]]; then
        awk "BEGIN {printf \"%.0f\", ${size_str%KB} * 1024}"
    elif [[ $size_str == *B ]]; then
        echo "${size_str%B}"
    else
        echo 0
    fi
}

# HTML 转义
html_escape() {
    echo "$1" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g'
}

# 发送错误邮件
send_error_email() {
    local subject=$1
    local error_msg=$2
    
    local html_content="<html><body>
    <h2 style='color:red;'>备份检查失败</h2>
    <p>错误信息: <b>$(html_escape "$error_msg")</b></p>
    <p>桶名: <b>${BUCKET_NAME}</b></p>
    <p style='color:#666;'>检查时间范围: <b>$(date -d "@$threshold" +'%Y-%m-%d %H:%M:%S') 至 $(date +'%Y-%m-%d %H:%M:%S')</b></p>
    <p style='color:#888;font-size:12px;'>由自动备份监控系统生成。</p>
    </body></html>"
    
    send_email "$subject" "$html_content"
}

# 检查 OBS 备份
check_obs_backup() {
    log "开始检查 OBS 桶 ${BUCKET_NAME} 中的最近${CHECK_WINDOW_HOURS}小时备份..."
    
    # 设置固定12小时检查窗口
    threshold=$(date -d "${CHECK_WINDOW_HOURS} hours ago" +%s)
    window_start=$(date -d "@$threshold" +'%Y-%m-%d %H:%M:%S')
    window_end=$(date +'%Y-%m-%d %H:%M:%S')
    log "检查时间窗口: ${window_start} 至 ${window_end}"

    # 检查 obsutil 是否存在
    if [ ! -x "$OBSUTIL_BIN" ]; then
        log "错误:obsutil 不存在或不可执行: $OBSUTIL_BIN"
        send_error_email "❌ [备份告警] ${TODAY} OBS 检查失败" "obsutil 工具不存在或不可执行"
        exit 1
    fi

    # 执行 OBS 列表命令
    result=$($OBSUTIL_BIN ls "obs://${BUCKET_NAME}/" 2>&1)
    if [ $? -ne 0 ]; then
        log "错误:执行 obsutil ls 失败: $result"
        send_error_email "❌ [备份告警] ${TODAY} OBS 检查失败" "无法连接 OBS 服务"
        exit 1
    fi

    total_size=0
    found_files=0
    html_table=""

    html_table+="<table border=\"1\" cellspacing=\"0\" cellpadding=\"6\" style=\"border-collapse:collapse;font-family:sans-serif;font-size:14px;\">"
    html_table+="<tr style=\"background-color:#f0f0f0;\"><th>文件名</th><th>大小</th><th>修改时间</th></tr>"

    while IFS= read -r line; do
        [[ "$line" != obs://* ]] && continue

        object=$(echo "$line" | awk '{print $1}')
        last_modified=$(echo "$line" | awk '{print $2}')
        size_str=$(echo "$line" | awk '{print $3}')

        mod_epoch=$(date -d "$last_modified" +%s 2>/dev/null)
        [[ -z "$mod_epoch" || "$mod_epoch" -lt "$threshold" ]] && continue

        size_bytes=$(convert_size_to_bytes "$size_str")
        total_size=$((total_size + size_bytes))
        ((found_files++))

        html_table+="<tr><td>$(html_escape "$(basename "$object")")</td><td>$size_str</td><td>$last_modified</td></tr>"
    done <<< "$result"

    html_table+="</table><br/>"
    total_mb=$(awk "BEGIN {printf \"%.2f\", $total_size / 1024 / 1024}")

    # 构建邮件内容
    time_range_info="<p style='color:#666;'>检查时间范围: <b>${window_start} 至 ${window_end}</b></p>"
    
    if [ "$found_files" -eq 0 ]; then
        subject="❌ [备份告警] ${TODAY} OBS无新备份"
        message="<h2 style='color:red;'>未找到${CHECK_WINDOW_HOURS}小时内新增/变更的备份文件</h2>
                 <p>桶名:<b>${BUCKET_NAME}</b></p>
                 ${time_range_info}"
        log "错误:无新备份文件"
    elif [ "$total_size" -lt "$MIN_SIZE" ]; then
        subject="⚠️ [备份告警] ${TODAY} 备份总大小不足"
        message="<h2 style='color:orange;'>备份文件总大小不足</h2>
                 <p>文件数:${found_files},总大小:<b>${total_mb} MB</b>,低于 1MB 阈值</p>
                 ${time_range_info}"
        log "警告:备份大小不足"
    else
        subject="✅ [备份成功] ${TODAY} OBS 备份验证通过"
        message="<h2 style='color:green;'>备份验证成功</h2>
                 <p>文件数:${found_files},总大小:<b>${total_mb} MB</b></p>
                 ${time_range_info}"
        log "成功:备份正常"
    fi

    # 添加执行时间信息
    END_TIME=$(date +%s)
    DURATION=$((END_TIME - START_TIME))
    message+="<p style='color:#666;font-size:12px;'>脚本执行耗时: ${DURATION}秒</p>"

    full_html="<html><body>${message}${html_table}<p style='color:#888;font-size:12px;'>由自动备份监控系统生成。</p></body></html>"

    send_email "$subject" "$full_html"
}

# 主程序
init_log
check_obs_backup
echo "OBS 备份检查完成于: $(date +'%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
echo "==============================================" >> "$LOG_FILE"

三、使用说明

1. 脚本部署步骤

  1. 将脚本保存为 /usr/local/bin/check_obs_backup.sh
  2. 添加执行权限:chmod +x /usr/local/bin/check_obs_backup.sh
  3. 配置cron定时任务,每天执行一次:
0 9 * * * /path/to/check_obs_backup.sh

2. 配置参数说明

参数名 默认值 说明
BUCKET_NAME “cnsec” 要检查的OBS桶名
EMAIL_TO “user@163.com 接收通知的邮箱地址
MIN_SIZE 1MB 最小备份文件总大小阈值
LOG_FILE “/var/log/obs_backup_check.log” 日志文件路径
OBSUTIL_BIN “/usr/local/bin/obsutil/stable/obsutil” obsutil工具路径
CHECK_WINDOW_HOURS 12 检查时间窗口(小时)

3. 邮件通知示例

脚本会发送HTML格式的邮件,包含以下内容:

  1. 检查结果摘要(成功/警告/错误)
  2. 备份文件数量及总大小
  3. 检查时间范围
  4. 详细的文件列表表格
  5. 脚本执行耗时

四、常见问题排查

  1. 邮件发送失败
    • 确保系统已安装sendmail或postfix等邮件服务
    • 检查防火墙设置,确保25端口可用
  2. OBS连接失败
    • 验证AK/SK是否正确
    • 检查Endpoint配置是否符合区域要求
    • 确保服务器网络可以访问华为云OBS服务
  3. 无新备份文件
    • 检查备份任务是否正常运行
    • 确认备份任务的目标路径与脚本检查的桶名一致
    • 调整CHECK_WINDOW_HOURS参数以适应备份频率
OBS 备份检查工具一键卸载脚本的内容
#!/bin/bash
# OBS 备份检查工具一键卸载脚本

# 颜色定义
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
BLUE="\033[1;34m"
CYAN="\033[1;36m"
RESET="\033[0m"

echo -e "${BLUE}=====================================${RESET}"
echo -e "${CYAN}🗑️ 华为云 OBS 备份检查工具一键卸载脚本${RESET}"
echo -e "${BLUE}-------------------------------------${RESET}"
echo -e "${YELLOW}本脚本将执行以下操作:${RESET}"
echo -e "${RED}1.${RESET} 停止所有相关的 cron 任务"
echo -e "${RED}2.${RESET} 删除 obsutil 工具"
echo -e "${RED}3.${RESET} 删除备份检查脚本"
echo -e "${RED}4.${RESET} 删除日志文件"
echo -e "${RED}5.${RESET} 删除软链接"
echo -e "${BLUE}=====================================${RESET}\n"

# 确认操作
read -p "$(echo -e "${YELLOW}⚠️  确定要卸载 OBS 备份检查工具吗?(y/n): ${RESET}")" confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
    echo -e "${GREEN}取消卸载操作${RESET}"
    exit 0
fi

# 1. 停止 cron 任务
echo -e "${YELLOW}🛑 停止 cron 任务...${RESET}"
crontab -l | grep -v "check_obs_backup.sh" | crontab -
echo -e "${GREEN}✅ 已从 crontab 中移除备份检查任务${RESET}"

# 2. 删除 obsutil 工具
echo -e "${YELLOW}🗑️ 删除 obsutil 工具...${RESET}"
OBSUTIL_DIR="/usr/local/bin/obsutil"
if [ -d "$OBSUTIL_DIR" ]; then
    rm -rf "$OBSUTIL_DIR"
    echo -e "${GREEN}✅ 已删除 obsutil 目录: $OBSUTIL_DIR${RESET}"
else
    echo -e "${YELLOW}⚠️  obsutil 目录不存在: $OBSUTIL_DIR${RESET}"
fi

# 3. 删除软链接
echo -e "${YELLOW}🔗 删除软链接...${RESET}"
BIN_LINK="/usr/bin/obsutil"
if [ -L "$BIN_LINK" ]; then
    rm -f "$BIN_LINK"
    echo -e "${GREEN}✅ 已删除软链接: $BIN_LINK${RESET}"
else
    echo -e "${YELLOW}⚠️  软链接不存在: $BIN_LINK${RESET}"
fi

# 4. 删除备份检查脚本
echo -e "${YELLOW}📜 删除备份检查脚本...${RESET}"
CHECK_SCRIPT="/usr/local/bin/check_obs_backup.sh"
if [ -f "$CHECK_SCRIPT" ]; then
    rm -f "$CHECK_SCRIPT"
    echo -e "${GREEN}✅ 已删除备份检查脚本: $CHECK_SCRIPT${RESET}"
else
    echo -e "${YELLOW}⚠️  备份检查脚本不存在: $CHECK_SCRIPT${RESET}"
fi

# 5. 删除安装脚本
echo -e "${YELLOW}📜 删除安装脚本...${RESET}"
INSTALL_SCRIPT="/usr/local/bin/install_obsutil.sh"
if [ -f "$INSTALL_SCRIPT" ]; then
    rm -f "$INSTALL_SCRIPT"
    echo -e "${GREEN}✅ 已删除安装脚本: $INSTALL_SCRIPT${RESET}"
else
    echo -e "${YELLOW}⚠️  安装脚本不存在: $INSTALL_SCRIPT${RESET}"
fi

# 6. 删除日志文件(可选保留)
read -p "$(echo -e "${YELLOW}❓ 是否要删除日志文件 /var/log/obs_backup_check.log?(y/n): ${RESET}")" log_confirm
if [[ "$log_confirm" == "y" || "$log_confirm" == "Y" ]]; then
    LOG_FILE="/var/log/obs_backup_check.log"
    if [ -f "$LOG_FILE" ]; then
        rm -f "$LOG_FILE"
        echo -e "${GREEN}✅ 已删除日志文件: $LOG_FILE${RESET}"
    else
        echo -e "${YELLOW}⚠️  日志文件不存在: $LOG_FILE${RESET}"
    fi
fi

# 7. 删除配置文件(可选)
read -p "$(echo -e "${YELLOW}❓ 是否要删除 obsutil 配置文件 ~/.obsutilconfig?(y/n): ${RESET}")" config_confirm
if [[ "$config_confirm" == "y" || "$config_confirm" == "Y" ]]; then
    CONFIG_FILE="$HOME/.obsutilconfig"
    if [ -f "$CONFIG_FILE" ]; then
        rm -f "$CONFIG_FILE"
        echo -e "${GREEN}✅ 已删除配置文件: $CONFIG_FILE${RESET}"
    else
        echo -e "${YELLOW}⚠️  配置文件不存在: $CONFIG_FILE${RESET}"
    fi
fi

echo -e "\n${GREEN}🎉 OBS 备份检查工具已完全卸载!${RESET}"
echo -e "${YELLOW}注意: 本脚本不会卸载 sendmail/mailx 服务${RESET}"