序言
本教程旨在帮助用户快速部署华为云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/&/\&/g; s/</\</g; s/>/\>/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. 脚本部署步骤
- 将脚本保存为
/usr/local/bin/check_obs_backup.sh
- 添加执行权限:
chmod +x /usr/local/bin/check_obs_backup.sh
- 配置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格式的邮件,包含以下内容:
- 检查结果摘要(成功/警告/错误)
- 备份文件数量及总大小
- 检查时间范围
- 详细的文件列表表格
- 脚本执行耗时
四、常见问题排查
-
邮件发送失败
- 确保系统已安装sendmail或postfix等邮件服务
- 检查防火墙设置,确保25端口可用
-
OBS连接失败:
- 验证AK/SK是否正确
- 检查Endpoint配置是否符合区域要求
- 确保服务器网络可以访问华为云OBS服务
-
无新备份文件:
- 检查备份任务是否正常运行
- 确认备份任务的目标路径与脚本检查的桶名一致
- 调整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}"