本文目录导读:

我来介绍几种在Shell脚本中实现手动确认回滚策略的方法:
基础确认模式
#!/bin/bash
# 回滚确认函数
confirm_rollback() {
echo "警告:即将执行回滚操作!"
echo "操作时间:$(date)"
echo "当前环境:$(hostname)"
echo "备份文件:$1"
read -p "确认要执行回滚吗?(yes/no): " confirmation
case "$confirmation" in
yes|YES|y|Y)
return 0
;;
*)
echo "回滚操作已取消"
return 1
;;
esac
}
# 使用示例
if confirm_rollback "/backup/app_20240101.tar.gz"; then
echo "开始执行回滚..."
# 执行回滚命令
else
echo "回滚流程终止"
exit 1
fi
多级确认模式
#!/bin/bash
confirm_rollback_advanced() {
local backup_path="$1"
local target_app="$2"
echo "========================================"
echo " 回滚操作确认"
echo "========================================"
echo "回滚目标: $target_app"
echo "备份文件: $backup_path"
echo "========================================"
# 第一级确认:基本信息确认
read -p "以上信息是否正确?(yes/no): " first_confirm
[[ "$first_confirm" != "yes" ]] && { echo "操作取消"; return 1; }
# 第二级确认:检查当前状态
echo "当前应用状态:"
systemctl status "$target_app" 2>/dev/null | head -n 3 || echo "服务未运行"
read -p "确认要在此状态下执行回滚?(yes/no): " second_confirm
[[ "$second_confirm" != "yes" ]] && { echo "操作取消"; return 1; }
# 第三级确认:最终确认
echo ""
echo "!!!!!! 最终警告 !!!!!!"
echo "此操作将覆盖当前版本的应用文件"
echo "请在输入框中输入 'ROLLBACK' 确认执行:"
read -p "> " final_confirm
if [[ "$final_confirm" == "ROLLBACK" ]]; then
echo "开始执行回滚..."
return 0
else
echo "操作已取消"
return 1
fi
}
带超时的自动确认
#!/bin/bash
confirm_with_timeout() {
local timeout=${1:-30} # 默认30秒超时
local message=${2:-"确认执行回滚?"}
echo "$message"
echo "超时时间:${timeout}秒(超时将自动取消)"
if read -t "$timeout" -p "输入 yes 确认: " response; then
case "$response" in
yes|YES|y|Y)
return 0
;;
*)
echo "操作取消"
return 1
;;
esac
else
echo ""
echo "操作超时,自动取消"
return 1
fi
}
完整的回滚脚本示例
#!/bin/bash
# 颜色编码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 配置
BACKUP_DIR="/backups"
APP_DIR="/var/www/app"
BACKUP_FILE=""
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/rollback_${TIMESTAMP}.log"
# 日志函数
log() {
echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 列出可用备份
list_backups() {
echo -e "${YELLOW}可用备份列表:${NC}"
ls -1 "$BACKUP_DIR"/*.tar.gz 2>/dev/null || echo "未找到备份文件"
}
# 回滚确认函数
rollback_confirmation() {
clear
echo -e "${RED}=======================================${NC}"
echo -e "${RED} 回滚操作确认 (5步确认流程)${NC}"
echo -e "${RED}=======================================${NC}"
# 步骤1:环境确认
echo -e "\n${YELLOW}[步骤1/5] 环境确认${NC}"
echo "主机名: $(hostname)"
echo "当前用户: $(whoami)"
read -p "是否在正确的机器上执行?(yes/no): " env_confirm
[[ "$env_confirm" != "yes" ]] && return 1
# 步骤2:备份确认
echo -e "\n${YELLOW}[步骤2/5] 备份确认${NC}"
echo "将要使用的备份: $BACKUP_FILE"
echo "备份大小: $(du -h "$BACKUP_FILE")"
read -p "确认使用此备份?(yes/no): " backup_confirm
[[ "$backup_confirm" != "yes" ]] && return 1
# 步骤3:目标确认
echo -e "\n${YELLOW}[步骤3/5] 目标确认${NC}"
echo "目标目录: $APP_DIR"
echo "目录内容:"
ls -la "$APP_DIR" | head -5
read -p "确认目标目录正确?(yes/no): " target_confirm
[[ "$target_confirm" != "yes" ]] && return 1
# 步骤4:服务确认
echo -e "\n${YELLOW}[步骤4/5] 服务状态确认${NC}"
if systemctl is-active --quiet nginx 2>/dev/null; then
echo "Nginx 服务状态: 运行中 (将会重启)"
else
echo "Nginx 服务状态: 未运行 (将会启动)"
fi
read -p "是否继续?(yes/no): " service_confirm
[[ "$service_confirm" != "yes" ]] && return 1
# 步骤5:最终确认
echo -e "\n${RED}[步骤5/5] 最终确认${NC}"
echo -e "${RED}危险操作!这将覆盖当前应用文件${NC}"
echo "请输入 'ROLLBACK_NOW' 以确认执行:"
read final_confirm
if [[ "$final_confirm" != "ROLLBACK_NOW" ]]; then
echo -e "${YELLOW}操作已取消${NC}"
return 1
fi
return 0
}
# 执行回滚
execute_rollback() {
log "${GREEN}开始执行回滚...${NC}"
# 备份当前版本
log "备份当前版本..."
cp -r "$APP_DIR" "${APP_DIR}_backup_${TIMESTAMP}"
# 停止服务
log "停止服务..."
systemctl stop nginx 2>/dev/null
# 恢复备份
log "恢复备份..."
rm -rf "$APP_DIR"/*
tar -xzf "$BACKUP_FILE" -C "$APP_DIR"
# 启动服务
log "启动服务..."
systemctl start nginx 2>/dev/null
# 验证
log "验证回滚结果..."
if systemctl is-active --quiet nginx; then
echo -e "${GREEN}回滚成功完成!${NC}"
else
echo -e "${RED}回滚可能失败,请检查服务状态${NC}"
fi
log "回滚操作日志已保存至: $LOG_FILE"
}
# 主函数
main() {
# 检查root权限
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}此脚本需要root权限运行${NC}"
exit 1
fi
# 列出可用备份
list_backups
# 选择备份
read -p "请输入备份文件名: " BACKUP_FILE
BACKUP_FILE="$BACKUP_DIR/$BACKUP_FILE"
if [[ ! -f "$BACKUP_FILE" ]]; then
echo -e "${RED}备份文件不存在: $BACKUP_FILE${NC}"
exit 1
fi
# 执行确认流程
if rollback_confirmation; then
execute_rollback
else
echo -e "${YELLOW}回滚操作已取消${NC}"
exit 1
fi
}
# 运行主函数
main
交互式回滚菜单
#!/bin/bash
interactive_rollback_menu() {
while true; do
clear
echo "========================================"
echo " 回滚管理菜单"
echo "========================================"
echo "1. 查看可用备份"
echo "2. 执行快速回滚"
echo "3. 执行安全回滚(5步确认)"
echo "4. 查看回滚历史"
echo "5. 退出"
echo "========================================"
read -p "请选择操作 [1-5]: " choice
case $choice in
1)
echo "可用备份列表:"
ls -lh /backups/*.tar.gz 2>/dev/null
read -p "按回车键继续..."
;;
2)
echo "执行快速回滚..."
if confirm_rollback; then
execute_rollback
fi
;;
3)
echo "执行安全回滚..."
if rollback_confirmation; then
execute_rollback
fi
;;
4)
echo "回滚历史记录:"
cat /var/log/rollback.log 2>/dev/null || echo "无历史记录"
read -p "按回车键继续..."
;;
5)
echo "退出回滚管理"
exit 0
;;
*)
echo "无效选择"
sleep 2
;;
esac
done
}
使用建议
- 始终包含多重确认:特别是影响生产环境的操作
- 提供清晰的信息:显示当前状态、目标、影响范围
- 记录操作日志:便于审计和问题排查
- 支持取消操作:在每个步骤都应该允许用户取消
- 设置超时机制:避免脚本长时间等待用户输入
- 验证权限:确保有足够的权限执行操作
这些模式可以根据实际需求组合使用,为你的部署系统提供安全可靠的回滚机制。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播