#!/bin/bash # ======================================== # 全局配置 # ======================================== CURRENT_VERSION="1.1.0" UPDATE_URL="https://ghfast.top/https://raw.githubusercontent.com/qqrrooty/EZrealm/main/realm.sh" VERSION_CHECK_URL="https://ghfast.top/https://raw.githubusercontent.com/qqrrooty/EZrealm/main/version.txt" REALM_DIR="/root/realm" CONFIG_FILE="$REALM_DIR/config.toml" SERVICE_FILE="/etc/systemd/system/realm.service" LOG_FILE="/var/log/realm_manager.log" # ======================================== # 颜色定义 # ======================================== RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # ======================================== # 初始化检查 # ======================================== init_check() { # 检查root权限 if [[ $EUID -ne 0 ]]; then echo -e "${RED}✖ 必须使用root权限运行本脚本${NC}" exit 1 fi # 检查curl安装 if ! command -v curl &> /dev/null; then echo -e "${YELLOW}▶ 正在安装curl工具...${NC}" if command -v apt-get &> /dev/null; then apt-get update && apt-get install -y curl elif command -v yum &> /dev/null; then yum install -y curl else echo -e "${RED}✖ 无法安装curl,请手动安装${NC}" exit 1 fi fi # 创建必要目录 mkdir -p "$REALM_DIR" if [[ ! -w $(dirname "$LOG_FILE") ]]; then echo -e "${RED}✖ 日志目录不可写,请检查权限${NC}" exit 1 fi touch "$LOG_FILE" || { echo -e "${RED}✖ 无法创建日志文件${NC}" exit 1 } log "脚本启动 v$CURRENT_VERSION" } # ======================================== # 日志系统 # ======================================== log() { local log_msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1" echo -e "$log_msg" >> "$LOG_FILE" } # ======================================== # 版本比较函数 # ======================================== version_compare() { if [[ "$1" == "$2" ]]; then return 0 # 版本相同 fi local IFS=. local i ver1=($1) ver2=($2) for ((i=0; i<${#ver1[@]}; i++)); do if [[ -z ${ver2[i]} ]]; then ver2[i]=0 fi if ((10#${ver1[i]} > 10#${ver2[i]})); then return 1 # 当前版本更高 fi if ((10#${ver1[i]} < 10#${ver2[i]})); then return 2 # 远程版本更高 fi done return 0 } # ======================================== # 自动更新模块 # ======================================== check_update() { echo -e "\n${BLUE}▶ 正在检查更新...${NC}" # 获取远程版本(更严格的过滤) remote_version=$(curl -sL $VERSION_CHECK_URL 2>> "$LOG_FILE" | head -n1 | sed 's/[^0-9.]//g') if [[ -z "$remote_version" ]]; then log "版本检查失败:无法获取远程版本" echo -e "${RED}✖ 无法获取远程版本信息,请检查网络连接${NC}" return 1 fi # 验证版本号格式 if ! [[ "$remote_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then log "版本检查失败:无效的远程版本号 '$remote_version'" echo -e "${RED}✖ 远程版本号格式错误${NC}" return 1 fi # 版本比较 version_compare "$CURRENT_VERSION" "$remote_version" case $? in 0) echo -e "${GREEN}✓ 当前已是最新版本 v${CURRENT_VERSION}${NC}" return 1 ;; 1) echo -e "${YELLOW}⚠ 本地版本 v${CURRENT_VERSION} 比远程版本 v${remote_version} 更高${NC}" return 1 ;; 2) echo -e "${YELLOW}▶ 发现新版本 v${remote_version}${NC}" return 0 ;; esac } perform_update() { echo -e "${BLUE}▶ 开始更新...${NC}" log "尝试从 $UPDATE_URL 下载更新" # 下载临时文件 if ! curl -sL $UPDATE_URL -o "$0.tmp"; then log "更新失败:下载脚本失败" echo -e "${RED}✖ 下载更新失败,请检查网络${NC}" return 1 fi # 验证下载内容 if ! grep -q "CURRENT_VERSION" "$0.tmp"; then log "更新失败:下载文件无效" echo -e "${RED}✖ 下载文件校验失败${NC}" rm -f "$0.tmp" return 1 fi # 替换脚本 chmod +x "$0.tmp" mv -f "$0.tmp" "$0" log "更新完成,重启脚本" echo -e "${GREEN}✓ 更新成功,重新启动脚本...${NC}" # 传递参数跳过更新检查 exec "$0" "--no-update" "$@" } # ======================================== # 核心功能模块 # ======================================== deploy_realm() { log "开始安装Realm" echo -e "${BLUE}▶ 正在安装Realm...${NC}" mkdir -p "$REALM_DIR" cd "$REALM_DIR" || exit 1 # 获取最新版本号 echo -e "${BLUE}▶ 正在检测最新版本...${NC}" LATEST_VERSION=$(curl -sL https://ghfast.top/https://github.com/zhboner/realm/releases | grep -oE '/zhboner/realm/releases/tag/v[0-9]+\.[0-9]+\.[0-9]+' | head -n1 | cut -d'/' -f6 | tr -d 'v') # 版本号验证 if [[ -z "$LATEST_VERSION" || ! "$LATEST_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then log "版本检测失败,使用备用版本2.7.0" LATEST_VERSION="2.7.0" echo -e "${YELLOW}⚠ 无法获取最新版本,使用备用版本 v${LATEST_VERSION}${NC}" else echo -e "${GREEN}✓ 检测到最新版本 v${LATEST_VERSION}${NC}" fi # 下载最新版本 DOWNLOAD_URL="https://ghfast.top/https://github.com/zhboner/realm/releases/download/v${LATEST_VERSION}/realm-x86_64-unknown-linux-gnu.tar.gz" echo -e "${BLUE}▶ 正在下载 Realm v${LATEST_VERSION}...${NC}" if ! wget --show-progress -qO realm.tar.gz "$DOWNLOAD_URL"; then log "安装失败:下载错误" echo -e "${RED}✖ 文件下载失败,请检查:${NC}" echo -e "1. 网络连接状态" echo -e "2. GitHub访问权限" echo -e "3. 手动验证下载地址: $DOWNLOAD_URL" return 1 fi # 解压安装 tar -xzf realm.tar.gz chmod +x realm rm realm.tar.gz # 初始化配置文件 if [ ! -f "$CONFIG_FILE" ]; then echo -e "[network]\nno_tcp = false\nuse_udp = true" > "$CONFIG_FILE" fi # 创建服务文件 echo -e "${BLUE}▶ 创建系统服务...${NC}" cat > "$SERVICE_FILE" < /dev/null <= 0 && hour <= 23 )); then echo "0 $hour * * * root /usr/bin/systemctl restart realm" >>/etc/crontab log "添加定时任务:每日 $hour 时重启" echo -e "${GREEN}✔ 定时任务已添加!${NC}" else echo -e "${RED}✖ 无效时间!${NC}" fi ;; 2) sed -i "/realm/d" /etc/crontab log "清除定时任务" echo -e "${YELLOW}✔ 定时任务已清除!${NC}" ;; 3) echo -e "\n${BLUE}当前定时任务:${NC}" cat /etc/crontab | grep --color=auto "realm" ;; *) echo -e "${RED}✖ 无效选择!${NC}" ;; esac } uninstall() { log "开始卸载" echo -e "${YELLOW}▶ 正在卸载...${NC}" systemctl stop realm systemctl disable realm rm -rf "$REALM_DIR" rm -f "$SERVICE_FILE" rm -rf /root/realm rm -rf "$(pwd)"/realm.sh sed -i "/realm/d" /etc/crontab systemctl daemon-reload log "卸载完成" echo -e "${GREEN}✔ 已完全卸载!${NC}" } # ======================================== # 安装状态检测 # ======================================== check_installed() { if [[ -f "$REALM_DIR/realm" && -f "$SERVICE_FILE" ]]; then echo -e "${GREEN}已安装${NC}" else echo -e "${RED}未安装${NC}" fi } # ======================================== # 主界面 # ======================================== main_menu() { clear init_check # 处理跳过更新检查参数 local skip_update=false if [[ "$1" == "--no-update" ]]; then skip_update=true shift fi # 首次运行检查更新 if ! $skip_update; then check_update && perform_update "$@" fi while true; do echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" echo -e " " echo -e " ${BLUE}Realm 高级管理脚本 v$CURRENT_VERSION" echo -e " 修改by:Azimi 修改日期:2025/1/29" echo -e " 修改内容:1.基本重做了脚本" echo -e " 2.新增了自动更新脚本" echo -e " 3.realm支持检测最新版本" echo -e " (1)安装前请先更新系统软件包,缺少命令可能无法安装" echo -e " (2)如果启动失败请检查 /root/realm/config.toml下有无多余配置或者卸载后重新配置" echo -e " (3)该脚本只在debian系统下测试,未做其他系统适配,安装命令有别,可能无法启动。如若遇到问题,请自行解决" echo -e " 仓库:https://github.com/qqrrooty/EZrealm${NC}" echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" echo -e " " echo -e "${YELLOW}服务状态:$(service_control status)${NC}" echo -e "${YELLOW}安装状态:$(check_installed)${NC}" echo -e " " echo -e "${YELLOW}------------------${NC}" echo "1. 安装/更新 Realm" echo -e "${YELLOW}------------------${NC}" echo "2. 添加转发规则" echo "3. 查看转发规则" echo "4. 删除转发规则" echo -e "${YELLOW}------------------${NC}" echo "5. 启动服务" echo "6. 停止服务" echo "7. 重启服务" echo -e "${YELLOW}------------------${NC}" echo "8. 定时任务管理" echo "9. 查看日志" echo -e "${YELLOW}------------------${NC}" echo "10. 完全卸载" echo -e "${YELLOW}------------------${NC}" echo "0. 退出脚本" echo -e "${YELLOW}------------------${NC}" read -rp "请输入选项: " choice case $choice in 1) deploy_realm ;; 2) add_rule ;; 3) show_rules ;; 4) delete_rule ;; 5) service_control start ;; 6) service_control stop ;; 7) service_control restart ;; 8) manage_cron ;; 9) echo -e "\n${BLUE}最近日志:${NC}" tail -n 10 "$LOG_FILE" ;; 10) read -rp "确认完全卸载?(y/n): " confirm if [[ "$confirm" == "y" ]]; then uninstall read -rp "按回车键继续..." clear exit 0 fi ;; 0) exit 0 ;; *) echo -e "${RED}无效选项!${NC}" ;; esac read -rp "按回车键继续..." clear done } # ======================================== # 脚本入口 # ======================================== main_menu "$@"