#!/bin/bash # 删除命令乱码解决 stty erase ^h # 文字颜色 red='\033[31m' green='\033[32m' yellow='\033[33m' blue='\033[34m' # shellcheck disable=SC2034 purple='\033[35m' # shellcheck disable=SC2034 cyan='\033[36m' # shellcheck disable=SC2034 white='\033[37m' NC='\033[0m' # 恢复默认颜色 # 判断一个字符串是否是合法的IP地址 if_ip() { local ip=$1 local pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$" if [[ $ip =~ $pattern ]]; then # 检查每个数字是否在0到255之间 local IFS='.' read -ra octets <<< "$ip" for octet in "${octets[@]}"; do if (( octet < 0 || octet > 255 )); then return 1 fi done return 0 else return 1 fi } # 显示指定目录下的文件或目录 show_file(){ filer=$1 find /data/update/"$filer" -maxdepth 1 \( -type f -o -type d \) -printf "%T@\t%-20f\n" | sort -n | awk '{print strftime("%Y-%m-%d %H:%M:%S", $1)"\t"$2}' } # 获取当前时间,精确到秒,格式年月日时分秒 get_current_time() { local current_time current_time=$(date +"%Y%m%d_%H%M%S") echo "$current_time" } # 发包并解压缩 send_server_package(){ # 服务器地址 local ip=${1} # tar 包名 local package=${2}.tar.gz # 源服务器上的tar压缩包路径 local source_tar=${3} # 游戏服目标服务器上的目标目录路径 local destination_dir=${4} if [ -e $source_tar ]; then echo "正在处理服务器 $ip" scp "$source_tar/$package" "$ip:$destination_dir" || { echo "SCP 失败"; exit 1; } ssh "$ip" "tar -zxvf $destination_dir/$package -C $destination_dir" ssh "$ip" "rm -f $destination_dir/$package" echo "处理完成服务器 $ip " else echo "$source_tar/$package 不存在,请先去打包!" return fi } # 游戏代码更新 server_build_update(){ # 服务器代码 local code=$1 # 包名 show_file package | grep "$code" read -rp "请输入包名(不带文件后缀):" package # 机器列表 show_file script/txt read -rp "请输入ip或文件名(不带后缀): " channel # 是否重启 read -r -p "更新完毕,是否需要重启(Y/N): " reboot # 源服务器上的tar压缩包路径 local source_tar="/data/update/package/" local destination_dir="/data/shikong/$code" echo -e "开始发送游戏包,文件:$source_tar/$package, 机器:$channel, 重启:$reboot" case $code in "logic") if if_ip "$channel"; then send_server_package $channel $package $source_tar $destination_dir case $reboot in [yY][eE][sS]|[yY]) echo "暂未开放重启功能..." ;; *) echo "更新结束..." ;; esac else for ip in $(awk '{print $2}' "txt/$channel") do send_server_package $ip $package $source_tar $destination_dir case $reboot in [yY][eE][sS]|[yY]) echo "暂未开放重启功能..." ;; *) echo "更新结束..." ;; esac done fi ;; "world") ;; "chat") ;; esac } # 游戏代码打包 server_code_build(){ local code=$1 # shellcheck disable=SC2155 local time=$(get_current_time) show_file project | grep sk read -rp "请输入项目地址: " project local package="${project}_${time}" case $code in "logic") bash ./update_sk_logic.sh "$project" "$package" ;; "world") bash ./update_sk_world.sh "$project" "$package" ;; "chat") bash ./update_sk_chat.sh "$project" "$package" ;; esac } # 游戏服操作 game_server_option(){ local code=$1 echo -e "1.游戏服打包" echo -e "2.游戏服更新" read -rp "请输入选项编号: " choice case $choice in 1) server_code_build "$code" ;; 2) server_build_update "$code" ;; esac } # 主程序入口 main_menu() { while true; do local current_time current_time=$(get_current_time) echo -e "${blue}************************************${NC}" echo -e "${purple}欢迎使用时空更新脚本...${current_time}${NC}" echo -e "1.时空游戏服更新" echo -e "2.时空世界服更新" echo -e "3.时空聊天服更新" echo -e "4.登陆服更新" echo -e "5.支付服更新" echo -e "6.gm后台更新" echo -e "0.${red}退出${NC}" echo -e "${blue}************************************${NC}" read -rp "请输入选项编号: " choice case $choice in 1) game_server_option "logic" ;; 2) game_server_option "world" ;; 3) game_server_option "chat" ;; 4) echo -e "${red}暂未开放!!!${NC}" ;; 5) echo -e "${red}暂未开放!!!${NC}" ;; 6) echo -e "${red}暂未开放!!!${NC}" ;; 0) echo -e "${red}谢谢使用,再见!${NC}" exit 0 ;; *) echo -e "${red}无效的选项,请重新输入${NC}" ;; esac done } # 脚本开始执行 main