├── CN ├── old-realm.sh └── realm.sh ├── README.md ├── realm-2024.sh ├── realm-2025.sh ├── realm.sh ├── test ├── prevision.sh └── realm.sh └── version.txt /CN/old-realm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 检查realm是否已安装 4 | if [ -f "/root/realm/realm" ]; then 5 | echo "检测到realm已安装。" 6 | realm_status="已安装" 7 | realm_status_color="\033[0;32m" # 绿色 8 | else 9 | echo "realm未安装。" 10 | realm_status="未安装" 11 | realm_status_color="\033[0;31m" # 红色 12 | fi 13 | 14 | # 检查realm服务状态 15 | check_realm_service_status() { 16 | if systemctl is-active --quiet realm; then 17 | echo -e "\033[0;32m启用\033[0m" # 绿色 18 | else 19 | echo -e "\033[0;31m未启用\033[0m" # 红色 20 | fi 21 | } 22 | 23 | # 显示菜单的函数 24 | show_menu() { 25 | clear 26 | echo " 欢迎使用realm一键转发脚本" 27 | echo " ———————————— realm版本v2.7.0 ————————————" 28 | echo " 修改by:Azimi 修改日期:2025/1/17" 29 | echo " 修改内容:1.修改查看转发规则内容更加清晰" 30 | echo " 2.添加/删除规则后自动重启服务" 31 | echo " 3.更新realm版本至2.7.0" 32 | echo " " 33 | echo " (1)更新脚本请先删除脚本 rm realm.sh" 34 | echo " (2)安装前请先更新系统软件包,缺少命令可能无法安装" 35 | echo " (3)如果启动失败请检查 /root/realm/config.toml下有无多余配置或者卸载后重新配置" 36 | echo " (4)该脚本只在debian系统下测试,未做其他系统适配,安装命令有别,可能无法启动。如若遇到问题,请自行解决" 37 | echo " PS:没多少时间做系统适配,我尽力而为" 38 | echo " 仓库:https://github.com/qqrrooty/EZrealm" 39 | echo " " 40 | echo "——————————————————" 41 | echo " 1. 安装 realm" 42 | echo "——————————————————" 43 | echo " 2. 添加 realm 转发规则" 44 | echo " 3. 查看 realm 转发规则" 45 | echo " 4. 删除 realm 转发规则" 46 | echo "——————————————————" 47 | echo " 5. 启动 realm 服务" 48 | echo " 6. 停止 realm 服务" 49 | echo " 7. 重启 realm 服务" 50 | echo "——————————————————" 51 | echo " 8. 卸载 realm" 52 | echo "——————————————————" 53 | echo " 9. 定时重启任务" 54 | echo "——————————————————" 55 | echo " 0. 退出脚本" 56 | echo "——————————————————" 57 | echo " " 58 | echo -e "realm 状态:${realm_status_color}${realm_status}\033[0m" 59 | echo -n "realm 转发状态:" 60 | check_realm_service_status 61 | } 62 | 63 | # 部署环境的函数 64 | deploy_realm() { 65 | mkdir -p /root/realm 66 | cd /root/realm 67 | wget -O realm.tar.gz https://mirror.ghproxy.com/https://github.com/zhboner/realm/releases/download/v2.7.0/realm-x86_64-unknown-linux-gnu.tar.gz 68 | tar -xvf realm.tar.gz 69 | chmod +x realm 70 | # 创建服务文件 71 | echo "[Unit] 72 | Description=realm 73 | After=network-online.target 74 | Wants=network-online.target systemd-networkd-wait-online.service 75 | 76 | [Service] 77 | Type=simple 78 | User=root 79 | Restart=on-failure 80 | RestartSec=5s 81 | DynamicUser=true 82 | WorkingDirectory=/root/realm 83 | ExecStart=/root/realm/realm -c /root/realm/config.toml 84 | 85 | [Install] 86 | WantedBy=multi-user.target" > /etc/systemd/system/realm.service 87 | systemctl daemon-reload 88 | 89 | # 服务启动后,检查config.toml是否存在,如果不存在则创建 90 | if [ ! -f /root/realm/config.toml ]; then 91 | touch /root/realm/config.toml 92 | fi 93 | 94 | # 检查 config.toml 中是否已经包含 [network] 配置块 95 | network_count=$(grep -c '^\[network\]' /root/realm/config.toml) 96 | 97 | if [ "$network_count" -eq 0 ]; then 98 | # 如果没有找到 [network],将其添加到文件顶部 99 | echo "[network] 100 | no_tcp = false 101 | use_udp = true 102 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 103 | echo "[network] 配置已添加到 config.toml 文件。" 104 | 105 | elif [ "$network_count" -gt 1 ]; then 106 | # 如果找到多个 [network],删除多余的配置块,只保留第一个 107 | sed -i '0,/^\[\[endpoints\]\]/{//!d}' /root/realm/config.toml 108 | echo "[network] 109 | no_tcp = false 110 | use_udp = true 111 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 112 | echo "多余的 [network] 配置已删除。" 113 | else 114 | echo "[network] 配置已存在,跳过添加。" 115 | fi 116 | 117 | # 更新realm状态变量 118 | realm_status="已安装" 119 | realm_status_color="\033[0;32m" # 绿色 120 | echo "部署完成。" 121 | } 122 | 123 | # 卸载realm 124 | uninstall_realm() { 125 | systemctl stop realm 126 | systemctl disable realm 127 | rm -rf /etc/systemd/system/realm.service 128 | systemctl daemon-reload 129 | rm -rf /root/realm 130 | rm -rf "$(pwd)"/realm.sh 131 | sed -i '/realm/d' /etc/crontab 132 | echo "realm已被卸载。" 133 | # 更新realm状态变量 134 | realm_status="未安装" 135 | realm_status_color="\033[0;31m" # 红色 136 | } 137 | 138 | # 删除转发规则的函数 139 | delete_forward() { 140 | echo -e " 当前 Realm 转发规则 " 141 | echo -e "--------------------------------------------------------" 142 | printf "%-5s| %-15s| %-35s| %-20s\n" "序号" "本地地址:端口 " " 目的地地址:端口 " "备注" 143 | echo -e "--------------------------------------------------------" 144 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 145 | # 搜索所有包含 [[endpoints]] 的行,表示转发规则的起始行 146 | local lines=($(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml)) 147 | 148 | if [ ${#lines[@]} -eq 0 ]; then 149 | echo "没有发现任何转发规则。" 150 | return 151 | fi 152 | 153 | local index=1 154 | for line in "${lines[@]}"; do 155 | local line_number=$(echo $line | cut -d ':' -f 1) 156 | local remark_line=$((line_number + 1)) 157 | local listen_line=$((line_number + 2)) 158 | local remote_line=$((line_number + 3)) 159 | 160 | local remark=$(sed -n "${remark_line}p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 161 | local listen_info=$(sed -n "${listen_line}p" /root/realm/config.toml | cut -d '"' -f 2) 162 | local remote_info=$(sed -n "${remote_line}p" /root/realm/config.toml | cut -d '"' -f 2) 163 | 164 | local listen_ip_port=$listen_info 165 | local remote_ip_port=$remote_info 166 | 167 | printf "%-4s| %-14s| %-28s| %-20s\n" " $index" "$listen_info" "$remote_info" "$remark" 168 | echo -e "--------------------------------------------------------" 169 | let index+=1 170 | done 171 | 172 | 173 | echo "请输入要删除的转发规则序号,直接按回车返回主菜单。" 174 | read -p "选择: " choice 175 | if [ -z "$choice" ]; then 176 | echo "返回主菜单。" 177 | return 178 | fi 179 | 180 | if ! [[ $choice =~ ^[0-9]+$ ]]; then 181 | echo "无效输入,请输入数字。" 182 | return 183 | fi 184 | 185 | if [ $choice -lt 1 ] || [ $choice -gt ${#lines[@]} ]; then 186 | echo "选择超出范围,请输入有效序号。" 187 | return 188 | fi 189 | 190 | local chosen_line=${lines[$((choice-1))]} 191 | local start_line=$(echo $chosen_line | cut -d ':' -f 1) 192 | 193 | # 找到下一个 [[endpoints]] 行,确定删除范围的结束行 194 | local next_endpoints_line=$(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml | grep -A 1 "^$start_line:" | tail -n 1 | cut -d ':' -f 1) 195 | 196 | if [ -z "$next_endpoints_line" ] || [ "$next_endpoints_line" -le "$start_line" ]; then 197 | # 如果没有找到下一个 [[endpoints]],则删除到文件末尾 198 | end_line=$(wc -l < /root/realm/config.toml) 199 | else 200 | # 如果找到了下一个 [[endpoints]],则删除到它的前一行 201 | end_line=$((next_endpoints_line - 1)) 202 | fi 203 | 204 | # 使用 sed 删除指定行范围的内容 205 | sed -i "${start_line},${end_line}d" /root/realm/config.toml 206 | 207 | # 检查并删除可能多余的空行 208 | sed -i '/^\s*$/d' /root/realm/config.toml 209 | 210 | echo "转发规则及其备注已删除。" 211 | 212 | # 重启服务 213 | sudo systemctl restart realm.service 214 | } 215 | 216 | # 查看转发规则 217 | show_all_conf() { 218 | echo -e " 当前 Realm 转发规则 " 219 | echo -e "--------------------------------------------------------" 220 | printf "%-5s| %-15s| %-35s| %-20s\n" "序号" "本地地址:端口 " " 目的地地址:端口 " "备注" 221 | echo -e "--------------------------------------------------------" 222 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 223 | # 搜索所有包含 listen 的行,表示转发规则的起始行 224 | local lines=($(grep -n 'listen =' /root/realm/config.toml)) 225 | 226 | if [ ${#lines[@]} -eq 0 ]; then 227 | echo -e "没有发现任何转发规则。" 228 | return 229 | fi 230 | 231 | local index=1 232 | for line in "${lines[@]}"; do 233 | local line_number=$(echo $line | cut -d ':' -f 1) 234 | local listen_info=$(sed -n "${line_number}p" /root/realm/config.toml | cut -d '"' -f 2) 235 | local remote_info=$(sed -n "$((line_number + 1))p" /root/realm/config.toml | cut -d '"' -f 2) 236 | local remark=$(sed -n "$((line_number-1))p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 237 | 238 | local listen_ip_port=$listen_info 239 | local remote_ip_port=$remote_info 240 | 241 | printf "%-4s| %-14s| %-28s| %-20s\n" " $index" "$listen_info" "$remote_info" "$remark" 242 | echo -e "--------------------------------------------------------" 243 | let index+=1 244 | done 245 | } 246 | 247 | # 添加转发规则 248 | add_forward() { 249 | while true; do 250 | read -p "请输入本地监听端口: " local_port 251 | read -p "请输入需要转发的IP: " ip 252 | read -p "请输入需要转发端口: " port 253 | read -p "请输入备注(非中文): " remark 254 | # 追加到config.toml文件 255 | echo "[[endpoints]] 256 | # 备注: $remark 257 | listen = \"[::]:$local_port\" 258 | remote = \"$ip:$port\"" >> /root/realm/config.toml 259 | 260 | read -p "是否继续添加(Y/N)? " answer 261 | if [[ $answer != "Y" && $answer != "y" ]]; then 262 | break 263 | fi 264 | done 265 | 266 | sudo systemctl restart realm.service 267 | } 268 | 269 | # 启动服务 270 | start_service() { 271 | sudo systemctl unmask realm.service 272 | sudo systemctl daemon-reload 273 | sudo systemctl restart realm.service 274 | sudo systemctl enable realm.service 275 | echo "realm服务已启动并设置为开机自启。" 276 | } 277 | 278 | # 停止服务 279 | stop_service() { 280 | systemctl stop realm 281 | echo "realm服务已停止。" 282 | } 283 | 284 | # 重启服务 285 | restart_service() { 286 | sudo systemctl stop realm 287 | sudo systemctl unmask realm.service 288 | sudo systemctl daemon-reload 289 | sudo systemctl restart realm.service 290 | sudo systemctl enable realm.service 291 | echo "realm服务已重启。" 292 | } 293 | 294 | # 定时任务 295 | cron_restart() { 296 | echo -e "------------------------------------------------------------------" 297 | echo -e "realm定时重启任务: " 298 | echo -e "-----------------------------------" 299 | echo -e "[1] 配置realm定时重启任务" 300 | echo -e "[2] 删除realm定时重启任务" 301 | echo -e "-----------------------------------" 302 | read -p "请选择: " numcron 303 | if [ "$numcron" == "1" ]; then 304 | echo -e "------------------------------------------------------------------" 305 | echo -e "realm定时重启任务类型: " 306 | echo -e "-----------------------------------" 307 | echo -e "[1] 每?小时重启" 308 | echo -e "[2] 每日?点重启" 309 | echo -e "-----------------------------------" 310 | read -p "请选择: " numcrontype 311 | if [ "$numcrontype" == "1" ]; then 312 | echo -e "-----------------------------------" 313 | read -p "每?小时重启: " cronhr 314 | echo "0 */$cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 315 | echo -e "定时重启设置成功!" 316 | elif [ "$numcrontype" == "2" ]; then 317 | echo -e "-----------------------------------" 318 | read -p "每日?点重启: " cronhr 319 | echo "0 $cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 320 | echo -e "定时重启设置成功!" 321 | else 322 | echo "输入错误,请重试" 323 | exit 324 | fi 325 | elif [ "$numcron" == "2" ]; then 326 | sed -i "/realm/d" /etc/crontab 327 | echo -e "定时重启任务删除完成!" 328 | else 329 | echo "输入错误,请重试" 330 | exit 331 | fi 332 | } 333 | 334 | # 主循环 335 | while true; do 336 | show_menu 337 | read -p "请选择一个选项[0-9]: " choice 338 | # 去掉输入中的空格 339 | choice=$(echo $choice | tr -d '[:space:]') 340 | 341 | # 检查输入是否为数字,并在有效范围内 342 | if ! [[ "$choice" =~ ^[0-9]$ ]]; then 343 | echo "无效选项: $choice" 344 | continue 345 | fi 346 | 347 | case $choice in 348 | 1) 349 | deploy_realm 350 | ;; 351 | 2) 352 | add_forward 353 | ;; 354 | 3) 355 | show_all_conf 356 | ;; 357 | 4) 358 | delete_forward 359 | ;; 360 | 5) 361 | start_service 362 | ;; 363 | 6) 364 | stop_service 365 | ;; 366 | 7) 367 | restart_service 368 | ;; 369 | 8) 370 | uninstall_realm 371 | ;; 372 | 9) 373 | cron_restart 374 | ;; 375 | 0) 376 | echo "退出脚本。" # 显示退出消息 377 | exit 0 # 退出脚本 378 | ;; 379 | *) 380 | echo "无效选项: $choice" 381 | ;; 382 | esac 383 | read -p "按任意键继续..." key 384 | done 385 | -------------------------------------------------------------------------------- /CN/realm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # ======================================== 4 | # 全局配置 5 | # ======================================== 6 | CURRENT_VERSION="1.1.0" 7 | UPDATE_URL="https://ghfast.top/https://raw.githubusercontent.com/qqrrooty/EZrealm/main/realm.sh" 8 | VERSION_CHECK_URL="https://ghfast.top/https://raw.githubusercontent.com/qqrrooty/EZrealm/main/version.txt" 9 | REALM_DIR="/root/realm" 10 | CONFIG_FILE="$REALM_DIR/config.toml" 11 | SERVICE_FILE="/etc/systemd/system/realm.service" 12 | LOG_FILE="/var/log/realm_manager.log" 13 | 14 | # ======================================== 15 | # 颜色定义 16 | # ======================================== 17 | RED='\033[0;31m' 18 | GREEN='\033[0;32m' 19 | YELLOW='\033[1;33m' 20 | BLUE='\033[0;34m' 21 | NC='\033[0m' 22 | 23 | # ======================================== 24 | # 初始化检查 25 | # ======================================== 26 | init_check() { 27 | # 检查root权限 28 | if [[ $EUID -ne 0 ]]; then 29 | echo -e "${RED}✖ 必须使用root权限运行本脚本${NC}" 30 | exit 1 31 | fi 32 | 33 | # 检查curl安装 34 | if ! command -v curl &> /dev/null; then 35 | echo -e "${YELLOW}▶ 正在安装curl工具...${NC}" 36 | if command -v apt-get &> /dev/null; then 37 | apt-get update && apt-get install -y curl 38 | elif command -v yum &> /dev/null; then 39 | yum install -y curl 40 | else 41 | echo -e "${RED}✖ 无法安装curl,请手动安装${NC}" 42 | exit 1 43 | fi 44 | fi 45 | 46 | # 创建必要目录 47 | mkdir -p "$REALM_DIR" 48 | if [[ ! -w $(dirname "$LOG_FILE") ]]; then 49 | echo -e "${RED}✖ 日志目录不可写,请检查权限${NC}" 50 | exit 1 51 | fi 52 | touch "$LOG_FILE" || { 53 | echo -e "${RED}✖ 无法创建日志文件${NC}" 54 | exit 1 55 | } 56 | 57 | log "脚本启动 v$CURRENT_VERSION" 58 | } 59 | 60 | # ======================================== 61 | # 日志系统 62 | # ======================================== 63 | log() { 64 | local log_msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1" 65 | echo -e "$log_msg" >> "$LOG_FILE" 66 | } 67 | 68 | # ======================================== 69 | # 版本比较函数 70 | # ======================================== 71 | version_compare() { 72 | if [[ "$1" == "$2" ]]; then 73 | return 0 # 版本相同 74 | fi 75 | local IFS=. 76 | local i ver1=($1) ver2=($2) 77 | for ((i=0; i<${#ver1[@]}; i++)); do 78 | if [[ -z ${ver2[i]} ]]; then 79 | ver2[i]=0 80 | fi 81 | if ((10#${ver1[i]} > 10#${ver2[i]})); then 82 | return 1 # 当前版本更高 83 | fi 84 | if ((10#${ver1[i]} < 10#${ver2[i]})); then 85 | return 2 # 远程版本更高 86 | fi 87 | done 88 | return 0 89 | } 90 | 91 | # ======================================== 92 | # 自动更新模块 93 | # ======================================== 94 | check_update() { 95 | echo -e "\n${BLUE}▶ 正在检查更新...${NC}" 96 | 97 | # 获取远程版本(更严格的过滤) 98 | remote_version=$(curl -sL $VERSION_CHECK_URL 2>> "$LOG_FILE" | head -n1 | sed 's/[^0-9.]//g') 99 | if [[ -z "$remote_version" ]]; then 100 | log "版本检查失败:无法获取远程版本" 101 | echo -e "${RED}✖ 无法获取远程版本信息,请检查网络连接${NC}" 102 | return 1 103 | fi 104 | 105 | # 验证版本号格式 106 | if ! [[ "$remote_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 107 | log "版本检查失败:无效的远程版本号 '$remote_version'" 108 | echo -e "${RED}✖ 远程版本号格式错误${NC}" 109 | return 1 110 | fi 111 | 112 | # 版本比较 113 | version_compare "$CURRENT_VERSION" "$remote_version" 114 | case $? in 115 | 0) 116 | echo -e "${GREEN}✓ 当前已是最新版本 v${CURRENT_VERSION}${NC}" 117 | return 1 118 | ;; 119 | 1) 120 | echo -e "${YELLOW}⚠ 本地版本 v${CURRENT_VERSION} 比远程版本 v${remote_version} 更高${NC}" 121 | return 1 122 | ;; 123 | 2) 124 | echo -e "${YELLOW}▶ 发现新版本 v${remote_version}${NC}" 125 | return 0 126 | ;; 127 | esac 128 | } 129 | 130 | perform_update() { 131 | echo -e "${BLUE}▶ 开始更新...${NC}" 132 | log "尝试从 $UPDATE_URL 下载更新" 133 | 134 | # 下载临时文件 135 | if ! curl -sL $UPDATE_URL -o "$0.tmp"; then 136 | log "更新失败:下载脚本失败" 137 | echo -e "${RED}✖ 下载更新失败,请检查网络${NC}" 138 | return 1 139 | fi 140 | 141 | # 验证下载内容 142 | if ! grep -q "CURRENT_VERSION" "$0.tmp"; then 143 | log "更新失败:下载文件无效" 144 | echo -e "${RED}✖ 下载文件校验失败${NC}" 145 | rm -f "$0.tmp" 146 | return 1 147 | fi 148 | 149 | # 替换脚本 150 | chmod +x "$0.tmp" 151 | mv -f "$0.tmp" "$0" 152 | log "更新完成,重启脚本" 153 | 154 | echo -e "${GREEN}✓ 更新成功,重新启动脚本...${NC}" 155 | # 传递参数跳过更新检查 156 | exec "$0" "--no-update" "$@" 157 | } 158 | 159 | # ======================================== 160 | # 核心功能模块 161 | # ======================================== 162 | deploy_realm() { 163 | log "开始安装Realm" 164 | echo -e "${BLUE}▶ 正在安装Realm...${NC}" 165 | 166 | mkdir -p "$REALM_DIR" 167 | cd "$REALM_DIR" || exit 1 168 | 169 | # 获取最新版本号 170 | echo -e "${BLUE}▶ 正在检测最新版本...${NC}" 171 | 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') 172 | 173 | # 版本号验证 174 | if [[ -z "$LATEST_VERSION" || ! "$LATEST_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 175 | log "版本检测失败,使用备用版本2.7.0" 176 | LATEST_VERSION="2.7.0" 177 | echo -e "${YELLOW}⚠ 无法获取最新版本,使用备用版本 v${LATEST_VERSION}${NC}" 178 | else 179 | echo -e "${GREEN}✓ 检测到最新版本 v${LATEST_VERSION}${NC}" 180 | fi 181 | 182 | # 下载最新版本 183 | DOWNLOAD_URL="https://ghfast.top/https://github.com/zhboner/realm/releases/download/v${LATEST_VERSION}/realm-x86_64-unknown-linux-gnu.tar.gz" 184 | echo -e "${BLUE}▶ 正在下载 Realm v${LATEST_VERSION}...${NC}" 185 | if ! wget --show-progress -qO realm.tar.gz "$DOWNLOAD_URL"; then 186 | log "安装失败:下载错误" 187 | echo -e "${RED}✖ 文件下载失败,请检查:${NC}" 188 | echo -e "1. 网络连接状态" 189 | echo -e "2. GitHub访问权限" 190 | echo -e "3. 手动验证下载地址: $DOWNLOAD_URL" 191 | return 1 192 | fi 193 | 194 | # 解压安装 195 | tar -xzf realm.tar.gz 196 | chmod +x realm 197 | rm realm.tar.gz 198 | 199 | # 初始化配置文件 200 | if [ ! -f "$CONFIG_FILE" ]; then 201 | echo -e "[network]\nno_tcp = false\nuse_udp = true" > "$CONFIG_FILE" 202 | fi 203 | 204 | # 创建服务文件 205 | echo -e "${BLUE}▶ 创建系统服务...${NC}" 206 | cat > "$SERVICE_FILE" < /dev/null <= 0 && hour <= 23 )); then 459 | echo "0 $hour * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 460 | log "添加定时任务:每日 $hour 时重启" 461 | echo -e "${GREEN}✔ 定时任务已添加!${NC}" 462 | else 463 | echo -e "${RED}✖ 无效时间!${NC}" 464 | fi 465 | ;; 466 | 2) 467 | sed -i "/realm/d" /etc/crontab 468 | log "清除定时任务" 469 | echo -e "${YELLOW}✔ 定时任务已清除!${NC}" 470 | ;; 471 | 3) 472 | echo -e "\n${BLUE}当前定时任务:${NC}" 473 | cat /etc/crontab | grep --color=auto "realm" 474 | ;; 475 | *) 476 | echo -e "${RED}✖ 无效选择!${NC}" 477 | ;; 478 | esac 479 | } 480 | 481 | uninstall() { 482 | log "开始卸载" 483 | echo -e "${YELLOW}▶ 正在卸载...${NC}" 484 | 485 | systemctl stop realm 486 | systemctl disable realm 487 | rm -rf "$REALM_DIR" 488 | rm -f "$SERVICE_FILE" 489 | rm -rf /root/realm 490 | rm -rf "$(pwd)"/realm.sh 491 | sed -i "/realm/d" /etc/crontab 492 | systemctl daemon-reload 493 | 494 | log "卸载完成" 495 | echo -e "${GREEN}✔ 已完全卸载!${NC}" 496 | } 497 | 498 | # ======================================== 499 | # 安装状态检测 500 | # ======================================== 501 | check_installed() { 502 | if [[ -f "$REALM_DIR/realm" && -f "$SERVICE_FILE" ]]; then 503 | echo -e "${GREEN}已安装${NC}" 504 | else 505 | echo -e "${RED}未安装${NC}" 506 | fi 507 | } 508 | 509 | # ======================================== 510 | # 主界面 511 | # ======================================== 512 | main_menu() { 513 | clear 514 | init_check 515 | 516 | # 处理跳过更新检查参数 517 | local skip_update=false 518 | if [[ "$1" == "--no-update" ]]; then 519 | skip_update=true 520 | shift 521 | fi 522 | 523 | # 首次运行检查更新 524 | if ! $skip_update; then 525 | check_update && perform_update "$@" 526 | fi 527 | 528 | while true; do 529 | echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" 530 | echo -e " " 531 | echo -e " ${BLUE}Realm 高级管理脚本 v$CURRENT_VERSION" 532 | echo -e " 修改by:Azimi 修改日期:2025/1/29" 533 | echo -e " 修改内容:1.基本重做了脚本" 534 | echo -e " 2.新增了自动更新脚本" 535 | echo -e " 3.realm支持检测最新版本" 536 | echo -e " (1)安装前请先更新系统软件包,缺少命令可能无法安装" 537 | echo -e " (2)如果启动失败请检查 /root/realm/config.toml下有无多余配置或者卸载后重新配置" 538 | echo -e " (3)该脚本只在debian系统下测试,未做其他系统适配,安装命令有别,可能无法启动。如若遇到问题,请自行解决" 539 | echo -e " 仓库:https://github.com/qqrrooty/EZrealm${NC}" 540 | echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" 541 | echo -e " " 542 | echo -e "${YELLOW}服务状态:$(service_control status)${NC}" 543 | echo -e "${YELLOW}安装状态:$(check_installed)${NC}" 544 | echo -e " " 545 | echo -e "${YELLOW}------------------${NC}" 546 | echo "1. 安装/更新 Realm" 547 | echo -e "${YELLOW}------------------${NC}" 548 | echo "2. 添加转发规则" 549 | echo "3. 查看转发规则" 550 | echo "4. 删除转发规则" 551 | echo -e "${YELLOW}------------------${NC}" 552 | echo "5. 启动服务" 553 | echo "6. 停止服务" 554 | echo "7. 重启服务" 555 | echo -e "${YELLOW}------------------${NC}" 556 | echo "8. 定时任务管理" 557 | echo "9. 查看日志" 558 | echo -e "${YELLOW}------------------${NC}" 559 | echo "10. 完全卸载" 560 | echo -e "${YELLOW}------------------${NC}" 561 | echo "0. 退出脚本" 562 | echo -e "${YELLOW}------------------${NC}" 563 | 564 | read -rp "请输入选项: " choice 565 | case $choice in 566 | 1) deploy_realm ;; 567 | 2) add_rule ;; 568 | 3) show_rules ;; 569 | 4) delete_rule ;; 570 | 5) service_control start ;; 571 | 6) service_control stop ;; 572 | 7) service_control restart ;; 573 | 8) manage_cron ;; 574 | 9) 575 | echo -e "\n${BLUE}最近日志:${NC}" 576 | tail -n 10 "$LOG_FILE" 577 | ;; 578 | 10) 579 | read -rp "确认完全卸载?(y/n): " confirm 580 | if [[ "$confirm" == "y" ]]; then 581 | uninstall 582 | read -rp "按回车键继续..." 583 | clear 584 | exit 0 585 | fi 586 | ;; 587 | 0) exit 0 588 | ;; 589 | *) echo -e "${RED}无效选项!${NC}" ;; 590 | esac 591 | read -rp "按回车键继续..." 592 | clear 593 | done 594 | } 595 | 596 | # ======================================== 597 | # 脚本入口 598 | # ======================================== 599 | main_menu "$@" 600 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 原仓库:https://github.com/Jaydooooooo/Port-forwarding 2 | 3 | 2025/1/29更新:半重做了脚本 4 | 5 | 国外机器 6 | 7 | wget -N https://raw.githubusercontent.com/qqrrooty/EZrealm/main/realm.sh && chmod +x realm.sh && ./realm.sh 8 | 9 | 国内机器 10 | 11 | wget -N https://ghfast.top/https://raw.githubusercontent.com/qqrrooty/EZrealm/main/CN/realm.sh && chmod +x realm.sh && ./realm.sh 12 | 13 | 再次运行本脚本只需要输入./realm.sh回车即可 14 | -------------------------------------------------------------------------------- /realm-2024.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 检查realm是否已安装 4 | if [ -f "/root/realm/realm" ]; then 5 | echo "检测到realm已安装。" 6 | realm_status="已安装" 7 | realm_status_color="\033[0;32m" # 绿色 8 | else 9 | echo "realm未安装。" 10 | realm_status="未安装" 11 | realm_status_color="\033[0;31m" # 红色 12 | fi 13 | 14 | # 检查realm服务状态 15 | check_realm_service_status() { 16 | if systemctl is-active --quiet realm; then 17 | echo -e "\033[0;32m启用\033[0m" # 绿色 18 | else 19 | echo -e "\033[0;31m未启用\033[0m" # 红色 20 | fi 21 | } 22 | 23 | # 显示菜单的函数 24 | show_menu() { 25 | clear 26 | echo " 欢迎使用realm一键转发脚本" 27 | echo " ———————————— realm版本v2.7.0 ————————————" 28 | echo " 修改by:Azimi 修改日期:2024/12/1" 29 | echo " 修改内容:1.修改查看转发规则内容更加清晰" 30 | echo " 2.添加/删除规则后自动重启服务" 31 | echo " 3.更新realm版本至2.7.0" 32 | echo " 更新脚本请先删除脚本 rm realm.sh" 33 | echo " 如果启动失败请检查 /root/realm/config.toml下有无多余配置或者卸载后重新配置" 34 | echo " debian系统如果命令无法启动请先更新系统/软件包" 35 | echo " 该脚本只在debian系统下测试,未做其他系统适配,可能无法启动。如若遇到问题,请自行解决" 36 | echo " PS:可能没时间做适配,我尽力而为" 37 | echo " 仓库:https://github.com/qqrrooty/EZrealm" 38 | echo " " 39 | echo "——————————————————" 40 | echo " 1. 安装 realm" 41 | echo "——————————————————" 42 | echo " 2. 添加 realm 转发规则" 43 | echo " 3. 查看 realm 转发规则" 44 | echo " 4. 删除 realm 转发规则" 45 | echo "——————————————————" 46 | echo " 5. 启动 realm 服务" 47 | echo " 6. 停止 realm 服务" 48 | echo " 7. 重启 realm 服务" 49 | echo "——————————————————" 50 | echo " 8. 卸载 realm" 51 | echo "——————————————————" 52 | echo " 9. 定时重启任务" 53 | echo "——————————————————" 54 | echo " 0. 退出脚本" 55 | echo "——————————————————" 56 | echo " " 57 | echo -e "realm 状态:${realm_status_color}${realm_status}\033[0m" 58 | echo -n "realm 转发状态:" 59 | check_realm_service_status 60 | } 61 | 62 | # 部署环境的函数 63 | deploy_realm() { 64 | mkdir -p /root/realm 65 | cd /root/realm 66 | cp /root/realm-x86_64-unknown-linux-gnu.tar.gz /root/realm/realm.tar.gz 67 | tar -xvf realm.tar.gz 68 | chmod +x realm 69 | # 创建服务文件 70 | echo "[Unit] 71 | Description=realm 72 | After=network-online.target 73 | Wants=network-online.target systemd-networkd-wait-online.service 74 | 75 | [Service] 76 | Type=simple 77 | User=root 78 | Restart=on-failure 79 | RestartSec=5s 80 | DynamicUser=true 81 | WorkingDirectory=/root/realm 82 | ExecStart=/root/realm/realm -c /root/realm/config.toml 83 | 84 | [Install] 85 | WantedBy=multi-user.target" > /etc/systemd/system/realm.service 86 | systemctl daemon-reload 87 | 88 | # 服务启动后,检查config.toml是否存在,如果不存在则创建 89 | if [ ! -f /root/realm/config.toml ]; then 90 | touch /root/realm/config.toml 91 | fi 92 | 93 | # 检查 config.toml 中是否已经包含 [network] 配置块 94 | network_count=$(grep -c '^\[network\]' /root/realm/config.toml) 95 | 96 | if [ "$network_count" -eq 0 ]; then 97 | # 如果没有找到 [network],将其添加到文件顶部 98 | echo "[network] 99 | no_tcp = false 100 | use_udp = true 101 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 102 | echo "[network] 配置已添加到 config.toml 文件。" 103 | 104 | elif [ "$network_count" -gt 1 ]; then 105 | # 如果找到多个 [network],删除多余的配置块,只保留第一个 106 | sed -i '0,/^\[\[endpoints\]\]/{//!d}' /root/realm/config.toml 107 | echo "[network] 108 | no_tcp = false 109 | use_udp = true 110 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 111 | echo "多余的 [network] 配置已删除。" 112 | else 113 | echo "[network] 配置已存在,跳过添加。" 114 | fi 115 | 116 | # 更新realm状态变量 117 | realm_status="已安装" 118 | realm_status_color="\033[0;32m" # 绿色 119 | echo "部署完成。" 120 | } 121 | 122 | # 卸载realm 123 | uninstall_realm() { 124 | systemctl stop realm 125 | systemctl disable realm 126 | rm -rf /etc/systemd/system/realm.service 127 | systemctl daemon-reload 128 | rm -rf /root/realm 129 | rm -rf "$(pwd)"/realm.sh 130 | sed -i '/realm/d' /etc/crontab 131 | echo "realm已被卸载。" 132 | # 更新realm状态变量 133 | realm_status="未安装" 134 | realm_status_color="\033[0;31m" # 红色 135 | } 136 | 137 | # 删除转发规则的函数 138 | delete_forward() { 139 | echo -e " 当前 Realm 转发规则 " 140 | echo -e "--------------------------------------------------------" 141 | printf "%-5s| %-15s| %-35s| %-20s\n" "序号" "本地地址:端口 " " 目的地地址:端口 " "备注" 142 | echo -e "--------------------------------------------------------" 143 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 144 | # 搜索所有包含 [[endpoints]] 的行,表示转发规则的起始行 145 | local lines=($(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml)) 146 | 147 | if [ ${#lines[@]} -eq 0 ]; then 148 | echo "没有发现任何转发规则。" 149 | return 150 | fi 151 | 152 | local index=1 153 | for line in "${lines[@]}"; do 154 | local line_number=$(echo $line | cut -d ':' -f 1) 155 | local remark_line=$((line_number + 1)) 156 | local listen_line=$((line_number + 2)) 157 | local remote_line=$((line_number + 3)) 158 | 159 | local remark=$(sed -n "${remark_line}p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 160 | local listen_info=$(sed -n "${listen_line}p" /root/realm/config.toml | cut -d '"' -f 2) 161 | local remote_info=$(sed -n "${remote_line}p" /root/realm/config.toml | cut -d '"' -f 2) 162 | 163 | local listen_ip_port=$listen_info 164 | local remote_ip_port=$remote_info 165 | 166 | printf "%-4s| %-14s| %-28s| %-20s\n" " $index" "$listen_info" "$remote_info" "$remark" 167 | echo -e "--------------------------------------------------------" 168 | let index+=1 169 | done 170 | 171 | 172 | echo "请输入要删除的转发规则序号,直接按回车返回主菜单。" 173 | read -p "选择: " choice 174 | if [ -z "$choice" ]; then 175 | echo "返回主菜单。" 176 | return 177 | fi 178 | 179 | if ! [[ $choice =~ ^[0-9]+$ ]]; then 180 | echo "无效输入,请输入数字。" 181 | return 182 | fi 183 | 184 | if [ $choice -lt 1 ] || [ $choice -gt ${#lines[@]} ]; then 185 | echo "选择超出范围,请输入有效序号。" 186 | return 187 | fi 188 | 189 | local chosen_line=${lines[$((choice-1))]} 190 | local start_line=$(echo $chosen_line | cut -d ':' -f 1) 191 | 192 | # 找到下一个 [[endpoints]] 行,确定删除范围的结束行 193 | local next_endpoints_line=$(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml | grep -A 1 "^$start_line:" | tail -n 1 | cut -d ':' -f 1) 194 | 195 | if [ -z "$next_endpoints_line" ] || [ "$next_endpoints_line" -le "$start_line" ]; then 196 | # 如果没有找到下一个 [[endpoints]],则删除到文件末尾 197 | end_line=$(wc -l < /root/realm/config.toml) 198 | else 199 | # 如果找到了下一个 [[endpoints]],则删除到它的前一行 200 | end_line=$((next_endpoints_line - 1)) 201 | fi 202 | 203 | # 使用 sed 删除指定行范围的内容 204 | sed -i "${start_line},${end_line}d" /root/realm/config.toml 205 | 206 | # 检查并删除可能多余的空行 207 | sed -i '/^\s*$/d' /root/realm/config.toml 208 | 209 | echo "转发规则及其备注已删除。" 210 | 211 | # 重启服务 212 | sudo systemctl restart realm.service 213 | } 214 | 215 | # 查看转发规则 216 | show_all_conf() { 217 | echo -e " 当前 Realm 转发规则 " 218 | echo -e "--------------------------------------------------------" 219 | printf "%-5s| %-15s| %-35s| %-20s\n" "序号" "本地地址:端口 " " 目的地地址:端口 " "备注" 220 | echo -e "--------------------------------------------------------" 221 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 222 | # 搜索所有包含 listen 的行,表示转发规则的起始行 223 | local lines=($(grep -n 'listen =' /root/realm/config.toml)) 224 | 225 | if [ ${#lines[@]} -eq 0 ]; then 226 | echo -e "没有发现任何转发规则。" 227 | return 228 | fi 229 | 230 | local index=1 231 | for line in "${lines[@]}"; do 232 | local line_number=$(echo $line | cut -d ':' -f 1) 233 | local listen_info=$(sed -n "${line_number}p" /root/realm/config.toml | cut -d '"' -f 2) 234 | local remote_info=$(sed -n "$((line_number + 1))p" /root/realm/config.toml | cut -d '"' -f 2) 235 | local remark=$(sed -n "$((line_number-1))p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 236 | 237 | local listen_ip_port=$listen_info 238 | local remote_ip_port=$remote_info 239 | 240 | printf "%-4s| %-14s| %-28s| %-20s\n" " $index" "$listen_info" "$remote_info" "$remark" 241 | echo -e "--------------------------------------------------------" 242 | let index+=1 243 | done 244 | } 245 | 246 | # 添加转发规则 247 | add_forward() { 248 | while true; do 249 | read -p "请输入本地监听端口: " local_port 250 | read -p "请输入需要转发的IP: " ip 251 | read -p "请输入需要转发端口: " port 252 | read -p "请输入备注(非中文): " remark 253 | # 追加到config.toml文件 254 | echo "[[endpoints]] 255 | # 备注: $remark 256 | listen = \"[::]:$local_port\" 257 | remote = \"$ip:$port\"" >> /root/realm/config.toml 258 | 259 | read -p "是否继续添加(Y/N)? " answer 260 | if [[ $answer != "Y" && $answer != "y" ]]; then 261 | break 262 | fi 263 | done 264 | 265 | sudo systemctl restart realm.service 266 | } 267 | 268 | # 启动服务 269 | start_service() { 270 | sudo systemctl unmask realm.service 271 | sudo systemctl daemon-reload 272 | sudo systemctl restart realm.service 273 | sudo systemctl enable realm.service 274 | echo "realm服务已启动并设置为开机自启。" 275 | } 276 | 277 | # 停止服务 278 | stop_service() { 279 | systemctl stop realm 280 | echo "realm服务已停止。" 281 | } 282 | 283 | # 重启服务 284 | restart_service() { 285 | sudo systemctl stop realm 286 | sudo systemctl unmask realm.service 287 | sudo systemctl daemon-reload 288 | sudo systemctl restart realm.service 289 | sudo systemctl enable realm.service 290 | echo "realm服务已重启。" 291 | } 292 | 293 | # 定时任务 294 | cron_restart() { 295 | echo -e "------------------------------------------------------------------" 296 | echo -e "realm定时重启任务: " 297 | echo -e "-----------------------------------" 298 | echo -e "[1] 配置realm定时重启任务" 299 | echo -e "[2] 删除realm定时重启任务" 300 | echo -e "-----------------------------------" 301 | read -p "请选择: " numcron 302 | if [ "$numcron" == "1" ]; then 303 | echo -e "------------------------------------------------------------------" 304 | echo -e "realm定时重启任务类型: " 305 | echo -e "-----------------------------------" 306 | echo -e "[1] 每?小时重启" 307 | echo -e "[2] 每日?点重启" 308 | echo -e "-----------------------------------" 309 | read -p "请选择: " numcrontype 310 | if [ "$numcrontype" == "1" ]; then 311 | echo -e "-----------------------------------" 312 | read -p "每?小时重启: " cronhr 313 | echo "0 */$cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 314 | echo -e "定时重启设置成功!" 315 | elif [ "$numcrontype" == "2" ]; then 316 | echo -e "-----------------------------------" 317 | read -p "每日?点重启: " cronhr 318 | echo "0 $cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 319 | echo -e "定时重启设置成功!" 320 | else 321 | echo "输入错误,请重试" 322 | exit 323 | fi 324 | elif [ "$numcron" == "2" ]; then 325 | sed -i "/realm/d" /etc/crontab 326 | echo -e "定时重启任务删除完成!" 327 | else 328 | echo "输入错误,请重试" 329 | exit 330 | fi 331 | } 332 | 333 | # 主循环 334 | while true; do 335 | show_menu 336 | read -p "请选择一个选项[0-9]: " choice 337 | # 去掉输入中的空格 338 | choice=$(echo $choice | tr -d '[:space:]') 339 | 340 | # 检查输入是否为数字,并在有效范围内 341 | if ! [[ "$choice" =~ ^[0-9]$ ]]; then 342 | echo "无效选项: $choice" 343 | continue 344 | fi 345 | 346 | case $choice in 347 | 1) 348 | deploy_realm 349 | ;; 350 | 2) 351 | add_forward 352 | ;; 353 | 3) 354 | show_all_conf 355 | ;; 356 | 4) 357 | delete_forward 358 | ;; 359 | 5) 360 | start_service 361 | ;; 362 | 6) 363 | stop_service 364 | ;; 365 | 7) 366 | restart_service 367 | ;; 368 | 8) 369 | uninstall_realm 370 | ;; 371 | 9) 372 | cron_restart 373 | ;; 374 | 0) 375 | echo "退出脚本。" # 显示退出消息 376 | exit 0 # 退出脚本 377 | ;; 378 | *) 379 | echo "无效选项: $choice" 380 | ;; 381 | esac 382 | read -p "按任意键继续..." key 383 | done 384 | -------------------------------------------------------------------------------- /realm-2025.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 检查realm是否已安装 4 | if [ -f "/root/realm/realm" ]; then 5 | echo "检测到realm已安装。" 6 | realm_status="已安装" 7 | realm_status_color="\033[0;32m" # 绿色 8 | else 9 | echo "realm未安装。" 10 | realm_status="未安装" 11 | realm_status_color="\033[0;31m" # 红色 12 | fi 13 | 14 | # 检查realm服务状态 15 | check_realm_service_status() { 16 | if systemctl is-active --quiet realm; then 17 | echo -e "\033[0;32m启用\033[0m" # 绿色 18 | else 19 | echo -e "\033[0;31m未启用\033[0m" # 红色 20 | fi 21 | } 22 | 23 | # 显示菜单的函数 24 | show_menu() { 25 | clear 26 | echo " 欢迎使用realm一键转发脚本" 27 | echo " ———————————— realm版本v2.7.0 ————————————" 28 | echo " 修改by:Azimi 修改日期:2025/1/17" 29 | echo " 修改内容:1.修改查看转发规则内容更加清晰" 30 | echo " 2.添加/删除规则后自动重启服务" 31 | echo " 3.更新realm版本至2.7.0" 32 | echo " " 33 | echo " (1)更新脚本请先删除脚本 rm realm.sh" 34 | echo " (2)安装前请先更新系统软件包,缺少命令可能无法安装" 35 | echo " (3)如果启动失败请检查 /root/realm/config.toml下有无多余配置或者卸载后重新配置" 36 | echo " (4)该脚本只在debian系统下测试,未做其他系统适配,安装命令有别,可能无法启动。如若遇到问题,请自行解决" 37 | echo " PS:没多少时间做系统适配,我尽力而为" 38 | echo " 仓库:https://github.com/qqrrooty/EZrealm" 39 | echo " " 40 | echo "——————————————————" 41 | echo " 1. 安装 realm" 42 | echo "——————————————————" 43 | echo " 2. 添加 realm 转发规则" 44 | echo " 3. 查看 realm 转发规则" 45 | echo " 4. 删除 realm 转发规则" 46 | echo "——————————————————" 47 | echo " 5. 启动 realm 服务" 48 | echo " 6. 停止 realm 服务" 49 | echo " 7. 重启 realm 服务" 50 | echo "——————————————————" 51 | echo " 8. 卸载 realm" 52 | echo "——————————————————" 53 | echo " 9. 定时重启任务" 54 | echo "——————————————————" 55 | echo " 0. 退出脚本" 56 | echo "——————————————————" 57 | echo " " 58 | echo -e "realm 状态:${realm_status_color}${realm_status}\033[0m" 59 | echo -n "realm 转发状态:" 60 | check_realm_service_status 61 | } 62 | 63 | # 部署环境的函数 64 | deploy_realm() { 65 | mkdir -p /root/realm 66 | cd /root/realm 67 | wget -O realm.tar.gz https://github.com/zhboner/realm/releases/download/v2.7.0/realm-x86_64-unknown-linux-gnu.tar.gz 68 | tar -xvf realm.tar.gz 69 | chmod +x realm 70 | # 创建服务文件 71 | echo "[Unit] 72 | Description=realm 73 | After=network-online.target 74 | Wants=network-online.target systemd-networkd-wait-online.service 75 | 76 | [Service] 77 | Type=simple 78 | User=root 79 | Restart=on-failure 80 | RestartSec=5s 81 | DynamicUser=true 82 | WorkingDirectory=/root/realm 83 | ExecStart=/root/realm/realm -c /root/realm/config.toml 84 | 85 | [Install] 86 | WantedBy=multi-user.target" > /etc/systemd/system/realm.service 87 | systemctl daemon-reload 88 | 89 | # 服务启动后,检查config.toml是否存在,如果不存在则创建 90 | if [ ! -f /root/realm/config.toml ]; then 91 | touch /root/realm/config.toml 92 | fi 93 | 94 | # 检查 config.toml 中是否已经包含 [network] 配置块 95 | network_count=$(grep -c '^\[network\]' /root/realm/config.toml) 96 | 97 | if [ "$network_count" -eq 0 ]; then 98 | # 如果没有找到 [network],将其添加到文件顶部 99 | echo "[network] 100 | no_tcp = false 101 | use_udp = true 102 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 103 | echo "[network] 配置已添加到 config.toml 文件。" 104 | 105 | elif [ "$network_count" -gt 1 ]; then 106 | # 如果找到多个 [network],删除多余的配置块,只保留第一个 107 | sed -i '0,/^\[\[endpoints\]\]/{//!d}' /root/realm/config.toml 108 | echo "[network] 109 | no_tcp = false 110 | use_udp = true 111 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 112 | echo "多余的 [network] 配置已删除。" 113 | else 114 | echo "[network] 配置已存在,跳过添加。" 115 | fi 116 | 117 | # 更新realm状态变量 118 | realm_status="已安装" 119 | realm_status_color="\033[0;32m" # 绿色 120 | echo "部署完成。" 121 | } 122 | 123 | # 卸载realm 124 | uninstall_realm() { 125 | systemctl stop realm 126 | systemctl disable realm 127 | rm -rf /etc/systemd/system/realm.service 128 | systemctl daemon-reload 129 | rm -rf /root/realm 130 | rm -rf "$(pwd)"/realm.sh 131 | sed -i '/realm/d' /etc/crontab 132 | echo "realm已被卸载。" 133 | # 更新realm状态变量 134 | realm_status="未安装" 135 | realm_status_color="\033[0;31m" # 红色 136 | } 137 | 138 | # 删除转发规则的函数 139 | delete_forward() { 140 | echo -e " 当前 Realm 转发规则 " 141 | echo -e "--------------------------------------------------------" 142 | printf "%-5s| %-15s| %-35s| %-20s\n" "序号" "本地地址:端口 " " 目的地地址:端口 " "备注" 143 | echo -e "--------------------------------------------------------" 144 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 145 | # 搜索所有包含 [[endpoints]] 的行,表示转发规则的起始行 146 | local lines=($(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml)) 147 | 148 | if [ ${#lines[@]} -eq 0 ]; then 149 | echo "没有发现任何转发规则。" 150 | return 151 | fi 152 | 153 | local index=1 154 | for line in "${lines[@]}"; do 155 | local line_number=$(echo $line | cut -d ':' -f 1) 156 | local remark_line=$((line_number + 1)) 157 | local listen_line=$((line_number + 2)) 158 | local remote_line=$((line_number + 3)) 159 | 160 | local remark=$(sed -n "${remark_line}p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 161 | local listen_info=$(sed -n "${listen_line}p" /root/realm/config.toml | cut -d '"' -f 2) 162 | local remote_info=$(sed -n "${remote_line}p" /root/realm/config.toml | cut -d '"' -f 2) 163 | 164 | local listen_ip_port=$listen_info 165 | local remote_ip_port=$remote_info 166 | 167 | printf "%-4s| %-14s| %-28s| %-20s\n" " $index" "$listen_info" "$remote_info" "$remark" 168 | echo -e "--------------------------------------------------------" 169 | let index+=1 170 | done 171 | 172 | 173 | echo "请输入要删除的转发规则序号,直接按回车返回主菜单。" 174 | read -p "选择: " choice 175 | if [ -z "$choice" ]; then 176 | echo "返回主菜单。" 177 | return 178 | fi 179 | 180 | if ! [[ $choice =~ ^[0-9]+$ ]]; then 181 | echo "无效输入,请输入数字。" 182 | return 183 | fi 184 | 185 | if [ $choice -lt 1 ] || [ $choice -gt ${#lines[@]} ]; then 186 | echo "选择超出范围,请输入有效序号。" 187 | return 188 | fi 189 | 190 | local chosen_line=${lines[$((choice-1))]} 191 | local start_line=$(echo $chosen_line | cut -d ':' -f 1) 192 | 193 | # 找到下一个 [[endpoints]] 行,确定删除范围的结束行 194 | local next_endpoints_line=$(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml | grep -A 1 "^$start_line:" | tail -n 1 | cut -d ':' -f 1) 195 | 196 | if [ -z "$next_endpoints_line" ] || [ "$next_endpoints_line" -le "$start_line" ]; then 197 | # 如果没有找到下一个 [[endpoints]],则删除到文件末尾 198 | end_line=$(wc -l < /root/realm/config.toml) 199 | else 200 | # 如果找到了下一个 [[endpoints]],则删除到它的前一行 201 | end_line=$((next_endpoints_line - 1)) 202 | fi 203 | 204 | # 使用 sed 删除指定行范围的内容 205 | sed -i "${start_line},${end_line}d" /root/realm/config.toml 206 | 207 | # 检查并删除可能多余的空行 208 | sed -i '/^\s*$/d' /root/realm/config.toml 209 | 210 | echo "转发规则及其备注已删除。" 211 | 212 | # 重启服务 213 | sudo systemctl restart realm.service 214 | } 215 | 216 | # 查看转发规则 217 | show_all_conf() { 218 | echo -e " 当前 Realm 转发规则 " 219 | echo -e "--------------------------------------------------------" 220 | printf "%-5s| %-15s| %-35s| %-20s\n" "序号" "本地地址:端口 " " 目的地地址:端口 " "备注" 221 | echo -e "--------------------------------------------------------" 222 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 223 | # 搜索所有包含 listen 的行,表示转发规则的起始行 224 | local lines=($(grep -n 'listen =' /root/realm/config.toml)) 225 | 226 | if [ ${#lines[@]} -eq 0 ]; then 227 | echo -e "没有发现任何转发规则。" 228 | return 229 | fi 230 | 231 | local index=1 232 | for line in "${lines[@]}"; do 233 | local line_number=$(echo $line | cut -d ':' -f 1) 234 | local listen_info=$(sed -n "${line_number}p" /root/realm/config.toml | cut -d '"' -f 2) 235 | local remote_info=$(sed -n "$((line_number + 1))p" /root/realm/config.toml | cut -d '"' -f 2) 236 | local remark=$(sed -n "$((line_number-1))p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 237 | 238 | local listen_ip_port=$listen_info 239 | local remote_ip_port=$remote_info 240 | 241 | printf "%-4s| %-14s| %-28s| %-20s\n" " $index" "$listen_info" "$remote_info" "$remark" 242 | echo -e "--------------------------------------------------------" 243 | let index+=1 244 | done 245 | } 246 | 247 | # 添加转发规则 248 | add_forward() { 249 | while true; do 250 | read -p "请输入本地监听端口: " local_port 251 | read -p "请输入需要转发的IP: " ip 252 | read -p "请输入需要转发端口: " port 253 | read -p "请输入备注(非中文): " remark 254 | # 追加到config.toml文件 255 | echo "[[endpoints]] 256 | # 备注: $remark 257 | listen = \"[::]:$local_port\" 258 | remote = \"$ip:$port\"" >> /root/realm/config.toml 259 | 260 | read -p "是否继续添加(Y/N)? " answer 261 | if [[ $answer != "Y" && $answer != "y" ]]; then 262 | break 263 | fi 264 | done 265 | 266 | sudo systemctl restart realm.service 267 | } 268 | 269 | # 启动服务 270 | start_service() { 271 | sudo systemctl unmask realm.service 272 | sudo systemctl daemon-reload 273 | sudo systemctl restart realm.service 274 | sudo systemctl enable realm.service 275 | echo "realm服务已启动并设置为开机自启。" 276 | } 277 | 278 | # 停止服务 279 | stop_service() { 280 | systemctl stop realm 281 | echo "realm服务已停止。" 282 | } 283 | 284 | # 重启服务 285 | restart_service() { 286 | sudo systemctl stop realm 287 | sudo systemctl unmask realm.service 288 | sudo systemctl daemon-reload 289 | sudo systemctl restart realm.service 290 | sudo systemctl enable realm.service 291 | echo "realm服务已重启。" 292 | } 293 | 294 | # 定时任务 295 | cron_restart() { 296 | echo -e "------------------------------------------------------------------" 297 | echo -e "realm定时重启任务: " 298 | echo -e "-----------------------------------" 299 | echo -e "[1] 配置realm定时重启任务" 300 | echo -e "[2] 删除realm定时重启任务" 301 | echo -e "-----------------------------------" 302 | read -p "请选择: " numcron 303 | if [ "$numcron" == "1" ]; then 304 | echo -e "------------------------------------------------------------------" 305 | echo -e "realm定时重启任务类型: " 306 | echo -e "-----------------------------------" 307 | echo -e "[1] 每?小时重启" 308 | echo -e "[2] 每日?点重启" 309 | echo -e "-----------------------------------" 310 | read -p "请选择: " numcrontype 311 | if [ "$numcrontype" == "1" ]; then 312 | echo -e "-----------------------------------" 313 | read -p "每?小时重启: " cronhr 314 | echo "0 */$cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 315 | echo -e "定时重启设置成功!" 316 | elif [ "$numcrontype" == "2" ]; then 317 | echo -e "-----------------------------------" 318 | read -p "每日?点重启: " cronhr 319 | echo "0 $cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 320 | echo -e "定时重启设置成功!" 321 | else 322 | echo "输入错误,请重试" 323 | exit 324 | fi 325 | elif [ "$numcron" == "2" ]; then 326 | sed -i "/realm/d" /etc/crontab 327 | echo -e "定时重启任务删除完成!" 328 | else 329 | echo "输入错误,请重试" 330 | exit 331 | fi 332 | } 333 | 334 | # 主循环 335 | while true; do 336 | show_menu 337 | read -p "请选择一个选项[0-9]: " choice 338 | # 去掉输入中的空格 339 | choice=$(echo $choice | tr -d '[:space:]') 340 | 341 | # 检查输入是否为数字,并在有效范围内 342 | if ! [[ "$choice" =~ ^[0-9]$ ]]; then 343 | echo "无效选项: $choice" 344 | continue 345 | fi 346 | 347 | case $choice in 348 | 1) 349 | deploy_realm 350 | ;; 351 | 2) 352 | add_forward 353 | ;; 354 | 3) 355 | show_all_conf 356 | ;; 357 | 4) 358 | delete_forward 359 | ;; 360 | 5) 361 | start_service 362 | ;; 363 | 6) 364 | stop_service 365 | ;; 366 | 7) 367 | restart_service 368 | ;; 369 | 8) 370 | uninstall_realm 371 | ;; 372 | 9) 373 | cron_restart 374 | ;; 375 | 0) 376 | echo "退出脚本。" # 显示退出消息 377 | exit 0 # 退出脚本 378 | ;; 379 | *) 380 | echo "无效选项: $choice" 381 | ;; 382 | esac 383 | read -p "按任意键继续..." key 384 | done 385 | -------------------------------------------------------------------------------- /realm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # ======================================== 4 | # 全局配置 5 | # ======================================== 6 | CURRENT_VERSION="1.1.1" 7 | UPDATE_URL="https://raw.githubusercontent.com/qqrrooty/EZrealm/main/realm.sh" 8 | VERSION_CHECK_URL="https://raw.githubusercontent.com/qqrrooty/EZrealm/main/version.txt" 9 | REALM_DIR="/root/realm" 10 | CONFIG_FILE="$REALM_DIR/config.toml" 11 | SERVICE_FILE="/etc/systemd/system/realm.service" 12 | LOG_FILE="/var/log/realm_manager.log" 13 | 14 | # ======================================== 15 | # 颜色定义 16 | # ======================================== 17 | RED='\033[0;31m' 18 | GREEN='\033[0;32m' 19 | YELLOW='\033[1;33m' 20 | BLUE='\033[0;34m' 21 | NC='\033[0m' 22 | 23 | # ======================================== 24 | # 初始化检查 25 | # ======================================== 26 | init_check() { 27 | # 检查root权限 28 | if [[ $EUID -ne 0 ]]; then 29 | echo -e "${RED}✖ 必须使用root权限运行本脚本${NC}" 30 | exit 1 31 | fi 32 | 33 | # 检查curl安装 34 | if ! command -v curl &> /dev/null; then 35 | echo -e "${YELLOW}▶ 正在安装curl工具...${NC}" 36 | if command -v apt-get &> /dev/null; then 37 | apt-get update && apt-get install -y curl 38 | elif command -v yum &> /dev/null; then 39 | yum install -y curl 40 | else 41 | echo -e "${RED}✖ 无法安装curl,请手动安装${NC}" 42 | exit 1 43 | fi 44 | fi 45 | 46 | # 创建必要目录 47 | mkdir -p "$REALM_DIR" 48 | if [[ ! -w $(dirname "$LOG_FILE") ]]; then 49 | echo -e "${RED}✖ 日志目录不可写,请检查权限${NC}" 50 | exit 1 51 | fi 52 | touch "$LOG_FILE" || { 53 | echo -e "${RED}✖ 无法创建日志文件${NC}" 54 | exit 1 55 | } 56 | 57 | log "脚本启动 v$CURRENT_VERSION" 58 | } 59 | 60 | # ======================================== 61 | # 日志系统 62 | # ======================================== 63 | log() { 64 | local log_msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1" 65 | echo -e "$log_msg" >> "$LOG_FILE" 66 | } 67 | 68 | # ======================================== 69 | # 版本比较函数 70 | # ======================================== 71 | version_compare() { 72 | if [[ "$1" == "$2" ]]; then 73 | return 0 # 版本相同 74 | fi 75 | local IFS=. 76 | local i ver1=($1) ver2=($2) 77 | for ((i=0; i<${#ver1[@]}; i++)); do 78 | if [[ -z ${ver2[i]} ]]; then 79 | ver2[i]=0 80 | fi 81 | if ((10#${ver1[i]} > 10#${ver2[i]})); then 82 | return 1 # 当前版本更高 83 | fi 84 | if ((10#${ver1[i]} < 10#${ver2[i]})); then 85 | return 2 # 远程版本更高 86 | fi 87 | done 88 | return 0 89 | } 90 | 91 | # ======================================== 92 | # 自动更新模块 93 | # ======================================== 94 | check_update() { 95 | echo -e "\n${BLUE}▶ 正在检查更新...${NC}" 96 | 97 | # 获取远程版本(更严格的过滤) 98 | remote_version=$(curl -sL $VERSION_CHECK_URL 2>> "$LOG_FILE" | head -n1 | sed 's/[^0-9.]//g') 99 | if [[ -z "$remote_version" ]]; then 100 | log "版本检查失败:无法获取远程版本" 101 | echo -e "${RED}✖ 无法获取远程版本信息,请检查网络连接${NC}" 102 | return 1 103 | fi 104 | 105 | # 验证版本号格式 106 | if ! [[ "$remote_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 107 | log "版本检查失败:无效的远程版本号 '$remote_version'" 108 | echo -e "${RED}✖ 远程版本号格式错误${NC}" 109 | return 1 110 | fi 111 | 112 | # 版本比较 113 | version_compare "$CURRENT_VERSION" "$remote_version" 114 | case $? in 115 | 0) 116 | echo -e "${GREEN}✓ 当前已是最新版本 v${CURRENT_VERSION}${NC}" 117 | return 1 118 | ;; 119 | 1) 120 | echo -e "${YELLOW}⚠ 本地版本 v${CURRENT_VERSION} 比远程版本 v${remote_version} 更高${NC}" 121 | return 1 122 | ;; 123 | 2) 124 | echo -e "${YELLOW}▶ 发现新版本 v${remote_version}${NC}" 125 | return 0 126 | ;; 127 | esac 128 | } 129 | 130 | perform_update() { 131 | echo -e "${BLUE}▶ 开始更新...${NC}" 132 | log "尝试从 $UPDATE_URL 下载更新" 133 | 134 | # 下载临时文件 135 | if ! curl -sL $UPDATE_URL -o "$0.tmp"; then 136 | log "更新失败:下载脚本失败" 137 | echo -e "${RED}✖ 下载更新失败,请检查网络${NC}" 138 | return 1 139 | fi 140 | 141 | # 验证下载内容 142 | if ! grep -q "CURRENT_VERSION" "$0.tmp"; then 143 | log "更新失败:下载文件无效" 144 | echo -e "${RED}✖ 下载文件校验失败${NC}" 145 | rm -f "$0.tmp" 146 | return 1 147 | fi 148 | 149 | # 替换脚本 150 | chmod +x "$0.tmp" 151 | mv -f "$0.tmp" "$0" 152 | log "更新完成,重启脚本" 153 | 154 | echo -e "${GREEN}✓ 更新成功,重新启动脚本...${NC}" 155 | # 传递参数跳过更新检查 156 | exec "$0" "--no-update" "$@" 157 | } 158 | 159 | # ======================================== 160 | # 核心功能模块 161 | # ======================================== 162 | deploy_realm() { 163 | log "开始安装Realm" 164 | echo -e "${BLUE}▶ 正在安装Realm...${NC}" 165 | 166 | mkdir -p "$REALM_DIR" 167 | cd "$REALM_DIR" || exit 1 168 | 169 | # 获取最新版本号 170 | echo -e "${BLUE}▶ 正在检测最新版本...${NC}" 171 | LATEST_VERSION=$(curl -sL 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') 172 | 173 | # 版本号验证 174 | if [[ -z "$LATEST_VERSION" || ! "$LATEST_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 175 | log "版本检测失败,使用备用版本2.7.0" 176 | LATEST_VERSION="2.7.0" 177 | echo -e "${YELLOW}⚠ 无法获取最新版本,使用备用版本 v${LATEST_VERSION}${NC}" 178 | else 179 | echo -e "${GREEN}✓ 检测到最新版本 v${LATEST_VERSION}${NC}" 180 | fi 181 | 182 | # 下载最新版本 183 | DOWNLOAD_URL="https://github.com/zhboner/realm/releases/download/v${LATEST_VERSION}/realm-x86_64-unknown-linux-gnu.tar.gz" 184 | echo -e "${BLUE}▶ 正在下载 Realm v${LATEST_VERSION}...${NC}" 185 | if ! wget --show-progress -qO realm.tar.gz "$DOWNLOAD_URL"; then 186 | log "安装失败:下载错误" 187 | echo -e "${RED}✖ 文件下载失败,请检查:${NC}" 188 | echo -e "1. 网络连接状态" 189 | echo -e "2. GitHub访问权限" 190 | echo -e "3. 手动验证下载地址: $DOWNLOAD_URL" 191 | return 1 192 | fi 193 | 194 | # 解压安装 195 | tar -xzf realm.tar.gz 196 | chmod +x realm 197 | rm realm.tar.gz 198 | 199 | # 初始化配置文件 200 | if [ ! -f "$CONFIG_FILE" ]; then 201 | echo -e "[network]\nno_tcp = false\nuse_udp = true" > "$CONFIG_FILE" 202 | fi 203 | 204 | # 创建服务文件 205 | echo -e "${BLUE}▶ 创建系统服务...${NC}" 206 | cat > "$SERVICE_FILE" < /dev/null <= 0 && hour <= 23 )); then 459 | echo "0 $hour * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 460 | log "添加定时任务:每日 $hour 时重启" 461 | echo -e "${GREEN}✔ 定时任务已添加!${NC}" 462 | else 463 | echo -e "${RED}✖ 无效时间!${NC}" 464 | fi 465 | ;; 466 | 2) 467 | sed -i "/realm/d" /etc/crontab 468 | log "清除定时任务" 469 | echo -e "${YELLOW}✔ 定时任务已清除!${NC}" 470 | ;; 471 | 3) 472 | echo -e "\n${BLUE}当前定时任务:${NC}" 473 | cat /etc/crontab | grep --color=auto "realm" 474 | ;; 475 | *) 476 | echo -e "${RED}✖ 无效选择!${NC}" 477 | ;; 478 | esac 479 | } 480 | 481 | uninstall() { 482 | log "开始卸载" 483 | echo -e "${YELLOW}▶ 正在卸载...${NC}" 484 | 485 | systemctl stop realm 486 | systemctl disable realm 487 | rm -rf "$REALM_DIR" 488 | rm -f "$SERVICE_FILE" 489 | rm -rf /root/realm 490 | rm -rf "$(pwd)"/realm.sh 491 | sed -i "/realm/d" /etc/crontab 492 | systemctl daemon-reload 493 | 494 | log "卸载完成" 495 | echo -e "${GREEN}✔ 已完全卸载!${NC}" 496 | } 497 | 498 | # ======================================== 499 | # 安装状态检测 500 | # ======================================== 501 | check_installed() { 502 | if [[ -f "$REALM_DIR/realm" && -f "$SERVICE_FILE" ]]; then 503 | echo -e "${GREEN}已安装${NC}" 504 | else 505 | echo -e "${RED}未安装${NC}" 506 | fi 507 | } 508 | 509 | # ======================================== 510 | # 主界面 511 | # ======================================== 512 | main_menu() { 513 | clear 514 | init_check 515 | 516 | # 处理跳过更新检查参数 517 | local skip_update=false 518 | if [[ "$1" == "--no-update" ]]; then 519 | skip_update=true 520 | shift 521 | fi 522 | 523 | # 首次运行检查更新 524 | if ! $skip_update; then 525 | check_update && perform_update "$@" 526 | fi 527 | 528 | while true; do 529 | echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" 530 | echo -e " " 531 | echo -e " ${BLUE}Realm 高级管理脚本 v$CURRENT_VERSION" 532 | echo -e " 修改by:Ami 修改日期:2025/4/1" 533 | echo -e " 修改内容:1.基本重做了脚本" 534 | echo -e " 2.新增了自动更新脚本" 535 | echo -e " 3.realm支持检测最新版本" 536 | echo -e " (1)安装前请先更新系统软件包,缺少命令可能无法安装" 537 | echo -e " (2)如果启动失败请检查 /root/realm/config.toml下有无多余配置或者卸载后重新配置" 538 | echo -e " (3)该脚本只在debian系统下测试,未做其他系统适配,安装命令有别,可能无法启动。如若遇到问题,请自行解决" 539 | echo -e " 仓库:https://github.com/qqrrooty/EZrealm" 540 | echo -e " 2025/4/1 更新:有人反馈该新版本添加规则过多后无法启动,如果遇到问题,可以尝试回退老版本(大概率是备注问题)" 541 | echo -e " 删除该脚本 rm realm.sh" 542 | echo -e " 运行 wget -N https://raw.githubusercontent.com/qqrrooty/EZrealm/main/realm-2024.sh && chmod +x realm.sh && ./realm.sh" 543 | echo -e " 或者 wget -N https://raw.githubusercontent.com/qqrrooty/EZrealm/main/realm-2025.sh && chmod +x realm.sh && ./realm.sh${NC}" 544 | echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" 545 | echo -e " " 546 | echo -e "${YELLOW}服务状态:$(service_control status)${NC}" 547 | echo -e "${YELLOW}安装状态:$(check_installed)${NC}" 548 | echo -e " " 549 | echo -e "${YELLOW}------------------${NC}" 550 | echo "1. 安装/更新 Realm" 551 | echo -e "${YELLOW}------------------${NC}" 552 | echo "2. 添加转发规则" 553 | echo "3. 查看转发规则" 554 | echo "4. 删除转发规则" 555 | echo -e "${YELLOW}------------------${NC}" 556 | echo "5. 启动服务" 557 | echo "6. 停止服务" 558 | echo "7. 重启服务" 559 | echo -e "${YELLOW}------------------${NC}" 560 | echo "8. 定时任务管理" 561 | echo "9. 查看日志" 562 | echo -e "${YELLOW}------------------${NC}" 563 | echo "10. 完全卸载" 564 | echo -e "${YELLOW}------------------${NC}" 565 | echo "0. 退出脚本" 566 | echo -e "${YELLOW}------------------${NC}" 567 | 568 | read -rp "请输入选项: " choice 569 | case $choice in 570 | 1) deploy_realm ;; 571 | 2) add_rule ;; 572 | 3) show_rules ;; 573 | 4) delete_rule ;; 574 | 5) service_control start ;; 575 | 6) service_control stop ;; 576 | 7) service_control restart ;; 577 | 8) manage_cron ;; 578 | 9) 579 | echo -e "\n${BLUE}最近日志:${NC}" 580 | tail -n 10 "$LOG_FILE" 581 | ;; 582 | 10) 583 | read -rp "确认完全卸载?(y/n): " confirm 584 | if [[ "$confirm" == "y" ]]; then 585 | uninstall 586 | read -rp "按回车键继续..." 587 | clear 588 | exit 0 589 | fi 590 | ;; 591 | 0) exit 0 592 | ;; 593 | *) echo -e "${RED}无效选项!${NC}" ;; 594 | esac 595 | read -rp "按回车键继续..." 596 | clear 597 | done 598 | } 599 | 600 | # ======================================== 601 | # 脚本入口 602 | # ======================================== 603 | main_menu "$@" 604 | -------------------------------------------------------------------------------- /test/prevision.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 检查realm是否已安装 4 | if [ -f "/root/realm/realm" ]; then 5 | echo "检测到realm已安装。" 6 | realm_status="已安装" 7 | realm_status_color="\033[0;32m" # 绿色 8 | else 9 | echo "realm未安装。" 10 | realm_status="未安装" 11 | realm_status_color="\033[0;31m" # 红色 12 | fi 13 | 14 | # 检查realm服务状态 15 | check_realm_service_status() { 16 | if systemctl is-active --quiet realm; then 17 | echo -e "\033[0;32m启用\033[0m" # 绿色 18 | else 19 | echo -e "\033[0;31m未启用\033[0m" # 红色 20 | fi 21 | } 22 | 23 | # 显示菜单的函数 24 | show_menu() { 25 | clear 26 | echo "欢迎使用realm一键转发脚本" 27 | echo "realm版本v2.6.3" 28 | echo "修改by:Azimi" 29 | echo "修改日期:2024/11/11" 30 | echo "修改内容:更新realm版本至最新v2.6.3" 31 | echo "========================" 32 | echo "1. 安装realm" 33 | echo "——————————————————" 34 | echo "2. 添加realm转发" 35 | echo "3. 查看realm转发" 36 | echo "4. 删除realm转发" 37 | echo "——————————————————" 38 | echo "5. 启动realm服务" 39 | echo "6. 停止realm服务" 40 | echo "——————————————————" 41 | echo "7. 卸载realm" 42 | echo "——————————————————" 43 | echo "8. 定时重启任务" 44 | echo "——————————————————" 45 | echo "9. 退出脚本" 46 | echo "========================" 47 | echo -e "realm 状态:${realm_status_color}${realm_status}\033[0m" 48 | echo -n "realm 转发状态:" 49 | check_realm_service_status 50 | } 51 | 52 | # 部署环境的函数 53 | deploy_realm() { 54 | mkdir -p /root/realm 55 | cd /root/realm 56 | wget -O realm.tar.gz https://github.com/zhboner/realm/releases/download/v2.6.3/realm-x86_64-unknown-linux-gnu.tar.gz 57 | tar -xvf realm.tar.gz 58 | chmod +x realm 59 | # 创建服务文件 60 | echo "[Unit] 61 | Description=realm 62 | After=network-online.target 63 | Wants=network-online.target systemd-networkd-wait-online.service 64 | 65 | [Service] 66 | Type=simple 67 | User=root 68 | Restart=on-failure 69 | RestartSec=5s 70 | DynamicUser=true 71 | WorkingDirectory=/root/realm 72 | ExecStart=/root/realm/realm -c /root/realm/config.toml 73 | 74 | [Install] 75 | WantedBy=multi-user.target" > /etc/systemd/system/realm.service 76 | systemctl daemon-reload 77 | 78 | # 服务启动后,检查config.toml是否存在,如果不存在则创建 79 | if [ ! -f /root/realm/config.toml ]; then 80 | touch /root/realm/config.toml 81 | fi 82 | 83 | # 检查 config.toml 中是否已经包含 [network] 配置块 84 | network_count=$(grep -c '^\[network\]' /root/realm/config.toml) 85 | 86 | if [ "$network_count" -eq 0 ]; then 87 | # 如果没有找到 [network],将其添加到文件顶部 88 | echo "[network] 89 | no_tcp = false 90 | use_udp = true 91 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 92 | echo "[network] 配置已添加到 config.toml 文件。" 93 | 94 | elif [ "$network_count" -gt 1 ]; then 95 | # 如果找到多个 [network],删除多余的配置块,只保留第一个 96 | sed -i '0,/^\[\[endpoints\]\]/{//!d}' /root/realm/config.toml 97 | echo "[network] 98 | no_tcp = false 99 | use_udp = true 100 | " | cat - /root/realm/config.toml > temp && mv temp /root/realm/config.toml 101 | echo "多余的 [network] 配置已删除。" 102 | else 103 | echo "[network] 配置已存在,跳过添加。" 104 | fi 105 | 106 | # 更新realm状态变量 107 | realm_status="已安装" 108 | realm_status_color="\033[0;32m" # 绿色 109 | echo "部署完成。" 110 | } 111 | 112 | # 卸载realm 113 | uninstall_realm() { 114 | systemctl stop realm 115 | systemctl disable realm 116 | rm -rf /etc/systemd/system/realm.service 117 | systemctl daemon-reload 118 | rm -rf /root/realm 119 | rm -rf "$(pwd)"/realm.sh 120 | sed -i '/realm/d' /etc/crontab 121 | echo "realm已被卸载。" 122 | # 更新realm状态变量 123 | realm_status="未安装" 124 | realm_status_color="\033[0;31m" # 红色 125 | } 126 | 127 | # 删除转发规则的函数 128 | delete_forward() { 129 | echo "当前转发规则:" 130 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 131 | # 搜索所有包含 [[endpoints]] 的行,表示转发规则的起始行 132 | local lines=($(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml)) 133 | 134 | if [ ${#lines[@]} -eq 0 ]; then 135 | echo "没有发现任何转发规则。" 136 | return 137 | fi 138 | 139 | local index=1 140 | for line in "${lines[@]}"; do 141 | local line_number=$(echo $line | cut -d ':' -f 1) 142 | local remark_line=$((line_number + 1)) 143 | local listen_line=$((line_number + 2)) 144 | local remote_line=$((line_number + 3)) 145 | 146 | local remark=$(sed -n "${remark_line}p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 147 | local listen_info=$(sed -n "${listen_line}p" /root/realm/config.toml | cut -d '"' -f 2) 148 | local remote_info=$(sed -n "${remote_line}p" /root/realm/config.toml | cut -d '"' -f 2) 149 | 150 | local listen_ip_port=$listen_info 151 | local remote_ip_port=$remote_info 152 | 153 | echo "${index}. 备注: ${remark}" 154 | echo " listen: ${listen_ip_port}, remote: ${remote_ip_port}" 155 | let index+=1 156 | done 157 | 158 | echo "请输入要删除的转发规则序号,直接按回车返回主菜单。" 159 | read -p "选择: " choice 160 | if [ -z "$choice" ]; then 161 | echo "返回主菜单。" 162 | return 163 | fi 164 | 165 | if ! [[ $choice =~ ^[0-9]+$ ]]; then 166 | echo "无效输入,请输入数字。" 167 | return 168 | fi 169 | 170 | if [ $choice -lt 1 ] || [ $choice -gt ${#lines[@]} ]; then 171 | echo "选择超出范围,请输入有效序号。" 172 | return 173 | fi 174 | 175 | local chosen_line=${lines[$((choice-1))]} 176 | local start_line=$(echo $chosen_line | cut -d ':' -f 1) 177 | 178 | # 找到下一个 [[endpoints]] 行,确定删除范围的结束行 179 | local next_endpoints_line=$(grep -n '^\[\[endpoints\]\]' /root/realm/config.toml | grep -A 1 "^$start_line:" | tail -n 1 | cut -d ':' -f 1) 180 | 181 | if [ -z "$next_endpoints_line" ] || [ "$next_endpoints_line" -le "$start_line" ]; then 182 | # 如果没有找到下一个 [[endpoints]],则删除到文件末尾 183 | end_line=$(wc -l < /root/realm/config.toml) 184 | else 185 | # 如果找到了下一个 [[endpoints]],则删除到它的前一行 186 | end_line=$((next_endpoints_line - 1)) 187 | fi 188 | 189 | # 使用 sed 删除指定行范围的内容 190 | sed -i "${start_line},${end_line}d" /root/realm/config.toml 191 | 192 | # 检查并删除可能多余的空行 193 | sed -i '/^\s*$/d' /root/realm/config.toml 194 | 195 | echo "转发规则及其备注已删除。" 196 | } 197 | 198 | # 查看转发规则 199 | show_all_conf() { 200 | echo "当前转发规则:" 201 | local IFS=$'\n' # 设置IFS仅以换行符作为分隔符 202 | # 搜索所有包含 listen 的行,表示转发规则的起始行 203 | local lines=($(grep -n 'listen =' /root/realm/config.toml)) 204 | 205 | if [ ${#lines[@]} -eq 0 ]; then 206 | echo "没有发现任何转发规则。" 207 | return 208 | fi 209 | 210 | local index=1 211 | for line in "${lines[@]}"; do 212 | local line_number=$(echo $line | cut -d ':' -f 1) 213 | local listen_info=$(sed -n "${line_number}p" /root/realm/config.toml | cut -d '"' -f 2) 214 | local remote_info=$(sed -n "$((line_number + 1))p" /root/realm/config.toml | cut -d '"' -f 2) 215 | local remark=$(sed -n "$((line_number-1))p" /root/realm/config.toml | grep "^# 备注:" | cut -d ':' -f 2) 216 | 217 | local listen_ip_port=$listen_info 218 | local remote_ip_port=$remote_info 219 | 220 | echo "${index}. 备注: ${remark}" 221 | echo " listen: ${listen_ip_port}, remote: ${remote_ip_port}" 222 | let index+=1 223 | done 224 | } 225 | 226 | # 添加转发规则 227 | add_forward() { 228 | while true; do 229 | read -p "请输入本地监听端口: " local_port 230 | read -p "请输入需要转发的IP: " ip 231 | read -p "请输入需要转发端口: " port 232 | read -p "请输入备注(非中文): " remark 233 | # 追加到config.toml文件 234 | echo "[[endpoints]] 235 | # 备注: $remark 236 | listen = \"[::]:$local_port\" 237 | remote = \"$ip:$port\"" >> /root/realm/config.toml 238 | 239 | read -p "是否继续添加(Y/N)? " answer 240 | if [[ $answer != "Y" && $answer != "y" ]]; then 241 | break 242 | fi 243 | done 244 | } 245 | 246 | # 启动服务 247 | start_service() { 248 | sudo systemctl unmask realm.service 249 | sudo systemctl daemon-reload 250 | sudo systemctl restart realm.service 251 | sudo systemctl enable realm.service 252 | echo "realm服务已启动并设置为开机自启。" 253 | } 254 | 255 | # 停止服务 256 | stop_service() { 257 | systemctl stop realm 258 | echo "realm服务已停止。" 259 | } 260 | 261 | # 定时任务 262 | cron_restart() { 263 | echo -e "------------------------------------------------------------------" 264 | echo -e "realm定时重启任务: " 265 | echo -e "-----------------------------------" 266 | echo -e "[1] 配置realm定时重启任务" 267 | echo -e "[2] 删除realm定时重启任务" 268 | echo -e "-----------------------------------" 269 | read -p "请选择: " numcron 270 | if [ "$numcron" == "1" ]; then 271 | echo -e "------------------------------------------------------------------" 272 | echo -e "realm定时重启任务类型: " 273 | echo -e "-----------------------------------" 274 | echo -e "[1] 每?小时重启" 275 | echo -e "[2] 每日?点重启" 276 | echo -e "-----------------------------------" 277 | read -p "请选择: " numcrontype 278 | if [ "$numcrontype" == "1" ]; then 279 | echo -e "-----------------------------------" 280 | read -p "每?小时重启: " cronhr 281 | echo "0 */$cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 282 | echo -e "定时重启设置成功!" 283 | elif [ "$numcrontype" == "2" ]; then 284 | echo -e "-----------------------------------" 285 | read -p "每日?点重启: " cronhr 286 | echo "0 $cronhr * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 287 | echo -e "定时重启设置成功!" 288 | else 289 | echo "输入错误,请重试" 290 | exit 291 | fi 292 | elif [ "$numcron" == "2" ]; then 293 | sed -i "/realm/d" /etc/crontab 294 | echo -e "定时重启任务删除完成!" 295 | else 296 | echo "输入错误,请重试" 297 | exit 298 | fi 299 | } 300 | 301 | # 主循环 302 | while true; do 303 | show_menu 304 | read -p "请选择一个选项: " choice 305 | # 去掉输入中的空格 306 | choice=$(echo $choice | tr -d '[:space:]') 307 | 308 | # 检查输入是否为数字,并在有效范围内 309 | if ! [[ "$choice" =~ ^[1-9]$ ]]; then 310 | echo "无效选项: $choice" 311 | continue 312 | fi 313 | 314 | case $choice in 315 | 1) 316 | deploy_realm 317 | ;; 318 | 2) 319 | add_forward 320 | ;; 321 | 3) 322 | show_all_conf 323 | ;; 324 | 4) 325 | delete_forward 326 | ;; 327 | 5) 328 | start_service 329 | ;; 330 | 6) 331 | stop_service 332 | ;; 333 | 7) 334 | uninstall_realm 335 | ;; 336 | 8) 337 | cron_restart 338 | ;; 339 | 9) 340 | echo "退出脚本。" # 显示退出消息 341 | exit 0 # 退出脚本 342 | ;; 343 | *) 344 | echo "无效选项: $choice" 345 | ;; 346 | esac 347 | read -p "按任意键继续..." key 348 | done 349 | -------------------------------------------------------------------------------- /test/realm.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # ======================================== 4 | # 全局配置 5 | # ======================================== 6 | CURRENT_VERSION="1.0.3" 7 | UPDATE_URL="https://raw.githubusercontent.com/qqrrooty/EZrealm/main/test/realm.sh" 8 | VERSION_CHECK_URL="https://raw.githubusercontent.com/qqrrooty/EZrealm/main/version.txt" 9 | REALM_DIR="/root/realm" 10 | CONFIG_FILE="$REALM_DIR/config.toml" 11 | SERVICE_FILE="/etc/systemd/system/realm.service" 12 | LOG_FILE="/var/log/realm_manager.log" 13 | 14 | # ======================================== 15 | # 颜色定义 16 | # ======================================== 17 | RED='\033[0;31m' 18 | GREEN='\033[0;32m' 19 | YELLOW='\033[1;33m' 20 | BLUE='\033[0;34m' 21 | NC='\033[0m' 22 | 23 | # ======================================== 24 | # 初始化检查 25 | # ======================================== 26 | init_check() { 27 | # 检查root权限 28 | if [[ $EUID -ne 0 ]]; then 29 | echo -e "${RED}✖ 必须使用root权限运行本脚本${NC}" 30 | exit 1 31 | fi 32 | 33 | # 检查curl安装 34 | if ! command -v curl &> /dev/null; then 35 | echo -e "${YELLOW}▶ 正在安装curl工具...${NC}" 36 | if command -v apt-get &> /dev/null; then 37 | apt-get update && apt-get install -y curl 38 | elif command -v yum &> /dev/null; then 39 | yum install -y curl 40 | else 41 | echo -e "${RED}✖ 无法安装curl,请手动安装${NC}" 42 | exit 1 43 | fi 44 | fi 45 | 46 | # 创建必要目录 47 | mkdir -p "$REALM_DIR" 48 | if [[ ! -w $(dirname "$LOG_FILE") ]]; then 49 | echo -e "${RED}✖ 日志目录不可写,请检查权限${NC}" 50 | exit 1 51 | fi 52 | touch "$LOG_FILE" || { 53 | echo -e "${RED}✖ 无法创建日志文件${NC}" 54 | exit 1 55 | } 56 | 57 | log "脚本启动 v$CURRENT_VERSION" 58 | } 59 | 60 | # ======================================== 61 | # 日志系统 62 | # ======================================== 63 | log() { 64 | local log_msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1" 65 | echo -e "$log_msg" >> "$LOG_FILE" 66 | } 67 | 68 | # ======================================== 69 | # 版本比较函数 70 | # ======================================== 71 | version_compare() { 72 | if [[ "$1" == "$2" ]]; then 73 | return 0 # 版本相同 74 | fi 75 | local IFS=. 76 | local i ver1=($1) ver2=($2) 77 | for ((i=0; i<${#ver1[@]}; i++)); do 78 | if [[ -z ${ver2[i]} ]]; then 79 | ver2[i]=0 80 | fi 81 | if ((10#${ver1[i]} > 10#${ver2[i]})); then 82 | return 1 # 当前版本更高 83 | fi 84 | if ((10#${ver1[i]} < 10#${ver2[i]})); then 85 | return 2 # 远程版本更高 86 | fi 87 | done 88 | return 0 89 | } 90 | 91 | # ======================================== 92 | # 自动更新模块 93 | # ======================================== 94 | check_update() { 95 | echo -e "\n${BLUE}▶ 正在检查更新...${NC}" 96 | 97 | # 获取远程版本(更严格的过滤) 98 | remote_version=$(curl -sL $VERSION_CHECK_URL 2>> "$LOG_FILE" | head -n1 | sed 's/[^0-9.]//g') 99 | if [[ -z "$remote_version" ]]; then 100 | log "版本检查失败:无法获取远程版本" 101 | echo -e "${RED}✖ 无法获取远程版本信息,请检查网络连接${NC}" 102 | return 1 103 | fi 104 | 105 | # 验证版本号格式 106 | if ! [[ "$remote_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 107 | log "版本检查失败:无效的远程版本号 '$remote_version'" 108 | echo -e "${RED}✖ 远程版本号格式错误${NC}" 109 | return 1 110 | fi 111 | 112 | # 版本比较 113 | version_compare "$CURRENT_VERSION" "$remote_version" 114 | case $? in 115 | 0) 116 | echo -e "${GREEN}✓ 当前已是最新版本 v${CURRENT_VERSION}${NC}" 117 | return 1 118 | ;; 119 | 1) 120 | echo -e "${YELLOW}⚠ 本地版本 v${CURRENT_VERSION} 比远程版本 v${remote_version} 更高${NC}" 121 | return 1 122 | ;; 123 | 2) 124 | echo -e "${YELLOW}▶ 发现新版本 v${remote_version}${NC}" 125 | return 0 126 | ;; 127 | esac 128 | } 129 | 130 | perform_update() { 131 | echo -e "${BLUE}▶ 开始更新...${NC}" 132 | log "尝试从 $UPDATE_URL 下载更新" 133 | 134 | # 下载临时文件 135 | if ! curl -sL $UPDATE_URL -o "$0.tmp"; then 136 | log "更新失败:下载脚本失败" 137 | echo -e "${RED}✖ 下载更新失败,请检查网络${NC}" 138 | return 1 139 | fi 140 | 141 | # 验证下载内容 142 | if ! grep -q "CURRENT_VERSION" "$0.tmp"; then 143 | log "更新失败:下载文件无效" 144 | echo -e "${RED}✖ 下载文件校验失败${NC}" 145 | rm -f "$0.tmp" 146 | return 1 147 | fi 148 | 149 | # 替换脚本 150 | chmod +x "$0.tmp" 151 | mv -f "$0.tmp" "$0" 152 | log "更新完成,重启脚本" 153 | 154 | echo -e "${GREEN}✓ 更新成功,重新启动脚本...${NC}" 155 | # 传递参数跳过更新检查 156 | exec "$0" "--no-update" "$@" 157 | } 158 | 159 | # ======================================== 160 | # 核心功能模块 161 | # ======================================== 162 | deploy_realm() { 163 | log "开始安装Realm" 164 | echo -e "${BLUE}▶ 正在安装Realm...${NC}" 165 | 166 | mkdir -p "$REALM_DIR" 167 | cd "$REALM_DIR" || exit 1 168 | 169 | # 获取最新版本号 170 | echo -e "${BLUE}▶ 正在检测最新版本...${NC}" 171 | LATEST_VERSION=$(curl -sL 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') 172 | 173 | # 版本号验证 174 | if [[ -z "$LATEST_VERSION" || ! "$LATEST_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then 175 | log "版本检测失败,使用备用版本2.7.0" 176 | LATEST_VERSION="2.7.0" 177 | echo -e "${YELLOW}⚠ 无法获取最新版本,使用备用版本 v${LATEST_VERSION}${NC}" 178 | else 179 | echo -e "${GREEN}✓ 检测到最新版本 v${LATEST_VERSION}${NC}" 180 | fi 181 | 182 | # 下载最新版本 183 | DOWNLOAD_URL="https://github.com/zhboner/realm/releases/download/v${LATEST_VERSION}/realm-x86_64-unknown-linux-gnu.tar.gz" 184 | echo -e "${BLUE}▶ 正在下载 Realm v${LATEST_VERSION}...${NC}" 185 | if ! wget --show-progress -qO realm.tar.gz "$DOWNLOAD_URL"; then 186 | log "安装失败:下载错误" 187 | echo -e "${RED}✖ 文件下载失败,请检查:${NC}" 188 | echo -e "1. 网络连接状态" 189 | echo -e "2. GitHub访问权限" 190 | echo -e "3. 手动验证下载地址: $DOWNLOAD_URL" 191 | return 1 192 | fi 193 | 194 | # 解压安装 195 | tar -xzf realm.tar.gz 196 | chmod +x realm 197 | rm realm.tar.gz 198 | 199 | # 初始化配置文件 200 | if [ ! -f "$CONFIG_FILE" ]; then 201 | echo -e "[network]\nno_tcp = false\nuse_udp = true" > "$CONFIG_FILE" 202 | fi 203 | 204 | # 创建服务文件 205 | echo -e "${BLUE}▶ 创建系统服务...${NC}" 206 | cat > "$SERVICE_FILE" < /dev/null <= 0 && hour <= 23 )); then 459 | echo "0 $hour * * * root /usr/bin/systemctl restart realm" >>/etc/crontab 460 | log "添加定时任务:每日 $hour 时重启" 461 | echo -e "${GREEN}✔ 定时任务已添加!${NC}" 462 | else 463 | echo -e "${RED}✖ 无效时间!${NC}" 464 | fi 465 | ;; 466 | 2) 467 | sed -i "/realm/d" /etc/crontab 468 | log "清除定时任务" 469 | echo -e "${YELLOW}✔ 定时任务已清除!${NC}" 470 | ;; 471 | 3) 472 | echo -e "\n${BLUE}当前定时任务:${NC}" 473 | cat /etc/crontab | grep --color=auto "realm" 474 | ;; 475 | *) 476 | echo -e "${RED}✖ 无效选择!${NC}" 477 | ;; 478 | esac 479 | } 480 | 481 | uninstall() { 482 | log "开始卸载" 483 | echo -e "${YELLOW}▶ 正在卸载...${NC}" 484 | 485 | systemctl stop realm 486 | systemctl disable realm 487 | rm -rf "$REALM_DIR" 488 | rm -f "$SERVICE_FILE" 489 | rm -rf /root/realm 490 | rm -rf "$(pwd)"/realm.sh 491 | sed -i "/realm/d" /etc/crontab 492 | systemctl daemon-reload 493 | 494 | log "卸载完成" 495 | echo -e "${GREEN}✔ 已完全卸载!${NC}" 496 | } 497 | 498 | # ======================================== 499 | # 安装状态检测 500 | # ======================================== 501 | check_installed() { 502 | if [[ -f "$REALM_DIR/realm" && -f "$SERVICE_FILE" ]]; then 503 | echo -e "${GREEN}已安装${NC}" 504 | else 505 | echo -e "${RED}未安装${NC}" 506 | fi 507 | } 508 | 509 | # ======================================== 510 | # 主界面 511 | # ======================================== 512 | main_menu() { 513 | clear 514 | init_check 515 | 516 | # 处理跳过更新检查参数 517 | local skip_update=false 518 | if [[ "$1" == "--no-update" ]]; then 519 | skip_update=true 520 | shift 521 | fi 522 | 523 | # 首次运行检查更新 524 | if ! $skip_update; then 525 | check_update && perform_update "$@" 526 | fi 527 | 528 | while true; do 529 | echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" 530 | echo -e " " 531 | echo -e " ${BLUE}Realm 高级管理脚本 v$CURRENT_VERSION" 532 | echo -e " 修改by:Azimi 修改日期:2025/1/29" 533 | echo -e " 修改内容:1.基本重做了脚本" 534 | echo -e " 2.新增了自动更新脚本" 535 | echo -e " 3.realm支持检测最新版本" 536 | echo -e " (1)安装前请先更新系统软件包,缺少命令可能无法安装" 537 | echo -e " (2)如果启动失败请检查 /root/realm/config.toml下有无多余配置或者卸载后重新配置" 538 | echo -e " (3)该脚本只在debian系统下测试,未做其他系统适配,安装命令有别,可能无法启动。如若遇到问题,请自行解决" 539 | echo -e " 仓库:https://github.com/qqrrooty/EZrealm${NC}" 540 | echo -e "${YELLOW}▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂﹍▂${NC}" 541 | echo -e " " 542 | echo -e "${YELLOW}服务状态:$(service_control status)${NC}" 543 | echo -e "${YELLOW}安装状态:$(check_installed)${NC}" 544 | echo -e " " 545 | echo -e "${YELLOW}------------------${NC}" 546 | echo "1. 安装/更新 Realm" 547 | echo -e "${YELLOW}------------------${NC}" 548 | echo "2. 添加转发规则" 549 | echo "3. 查看转发规则" 550 | echo "4. 删除转发规则" 551 | echo -e "${YELLOW}------------------${NC}" 552 | echo "5. 启动服务" 553 | echo "6. 停止服务" 554 | echo "7. 重启服务" 555 | echo -e "${YELLOW}------------------${NC}" 556 | echo "8. 定时任务管理" 557 | echo "9. 查看日志" 558 | echo -e "${YELLOW}------------------${NC}" 559 | echo "10. 完全卸载" 560 | echo -e "${YELLOW}------------------${NC}" 561 | echo "0. 退出脚本" 562 | echo -e "${YELLOW}------------------${NC}" 563 | 564 | read -rp "请输入选项: " choice 565 | case $choice in 566 | 1) deploy_realm ;; 567 | 2) add_rule ;; 568 | 3) show_rules ;; 569 | 4) delete_rule ;; 570 | 5) service_control start ;; 571 | 6) service_control stop ;; 572 | 7) service_control restart ;; 573 | 8) manage_cron ;; 574 | 9) 575 | echo -e "\n${BLUE}最近日志:${NC}" 576 | tail -n 10 "$LOG_FILE" 577 | ;; 578 | 10) 579 | read -rp "确认完全卸载?(y/n): " confirm 580 | if [[ "$confirm" == "y" ]]; then 581 | uninstall 582 | read -rp "按回车键继续..." 583 | clear 584 | exit 0 585 | fi 586 | ;; 587 | 0) exit 0 588 | ;; 589 | *) echo -e "${RED}无效选项!${NC}" ;; 590 | esac 591 | read -rp "按回车键继续..." 592 | clear 593 | done 594 | } 595 | 596 | # ======================================== 597 | # 脚本入口 598 | # ======================================== 599 | main_menu "$@" 600 | -------------------------------------------------------------------------------- /version.txt: -------------------------------------------------------------------------------- 1 | 1.1.1 2 | --------------------------------------------------------------------------------