#!/usr/bin/env bash # ============================================================================ # iperf3 服务管理工具 (istop) # # 快捷键: istop # 一键安装: bash <(curl -fsSL https://raw.githubusercontent.com/DuoJLa/istop/main/istop) # # 选项: # [1] 停止服务 + 关闭自启动 — 最常用,停掉 iperf3 并禁止开机自启 # [2] 彻底卸载 iperf3 (含软件包) — 停止+禁用+删服务文件+卸载软件包 (不可逆) # [3] 恢复自启动并启动服务 — 撤销 [1] 的操作 # [4] 帮助说明 — 查看本说明和安装命令 # [5] 卸载 istop(删除本工具) — 移除 /usr/local/bin/istop # [0] 退出 # ============================================================================ # ---- 全局配置 ---- INSTALL_PATH="/usr/local/bin/istop" RAW_URL="https://raw.githubusercontent.com/DuoJLa/istop/main/istop" SERVICE="iperf3.service" PORT="5201" # ---- 自动安装(首次通过管道执行时触发) ---- # 检测:如果当前进程名不是 istop 或安装路径不存在,则执行安装流程 if [ "$(basename "$0" 2>/dev/null)" != "istop" ] || [ ! -x "$INSTALL_PATH" ]; then echo ">>> 首次运行,正在安装 istop ..." if [ "$(id -u)" != "0" ]; then echo "需要 root 权限。请用 sudo 重新运行:" echo " sudo bash <(curl -fsSL $RAW_URL)" exit 1 fi curl -fsSL "$RAW_URL" -o "$INSTALL_PATH" \ && chmod +x "$INSTALL_PATH" \ && echo "安装完成!启动菜单..." \ && exec "$INSTALL_PATH" echo "安装失败,请检查网络连接。" exit 1 fi # ---- 严格模式 (安装完成后才启用) ---- set -u set -o pipefail # ---- 终端颜色 ---- # 检测是否在交互式终端中,非 TTY 时禁用 ANSI 颜色避免输出乱码 if [ -t 1 ]; then C_RESET='\033[0m'; C_BOLD='\033[1m'; C_GREEN='\033[32m'; C_YELLOW='\033[33m' C_RED='\033[31m'; C_CYAN='\033[36m'; C_DIM='\033[2m'; C_BLUE='\033[34m' else C_RESET=''; C_BOLD=''; C_GREEN=''; C_YELLOW=''; C_RED=''; C_CYAN=''; C_DIM=''; C_BLUE='' fi # ---- 辅助函数 ---- # 输出信息行(带 ==> 前缀) info() { echo -e "${C_BOLD}==>${C_RESET} $*"; } # 输出成功标记 ok() { echo -e " ${C_GREEN}✓${C_RESET} $*"; } # 输出警告标记 warn() { echo -e " ${C_YELLOW}!${C_RESET} $*"; } # 输出错误标记 err() { echo -e " ${C_RED}✗${C_RESET} $*"; } # ---- 环境检查 ---- # 验证 systemd 和 iperf3 是否可用,不可用时给出明确提示并退出 check_system() { if ! command -v systemctl >/dev/null 2>&1; then echo -e "${C_RED}错误: 未检测到 systemd,本工具仅适用于 systemd 系统。${C_RESET}" exit 2 fi if ! command -v iperf3 >/dev/null 2>&1; then echo -e "${C_YELLOW}提示: 系统中未安装 iperf3,无需处理。${C_RESET}" exit 0 fi } # ---- 状态获取 ---- # 从 systemd 和系统中获取 iperf3 服务的四种状态指标 get_status() { # 服务运行状态:通过 systemctl is-active 退出码判断(避免 stdout 重复) if systemctl is-active "$SERVICE" >/dev/null 2>&1; then STATUS_ACTIVE="${C_GREEN}运行中${C_RESET}" else STATUS_ACTIVE="${C_RED}已停止${C_RESET}" fi # 开机自启动状态 if systemctl is-enabled "$SERVICE" >/dev/null 2>&1; then STATUS_ENABLED="${C_GREEN}已启用${C_RESET}" else STATUS_ENABLED="${C_RED}已禁用${C_RESET}" fi # 端口监听状态 if ss -tln 2>/dev/null | grep -q ":$PORT "; then STATUS_PORT="${C_GREEN}是${C_RESET}" else STATUS_PORT="否" fi # 软件包版本 if command -v iperf3 >/dev/null 2>&1; then STATUS_VER=$(iperf3 --version 2>/dev/null | head -1) else STATUS_VER="未安装" fi } # 打印状态栏到终端 print_status() { get_status echo -e " ${C_CYAN}服务状态:${C_RESET} $STATUS_ACTIVE" echo -e " ${C_CYAN}开机自启:${C_RESET} $STATUS_ENABLED" echo -e " ${C_CYAN}端口 $PORT:${C_RESET} $STATUS_PORT" echo -e " ${C_CYAN}版本:${C_RESET} $STATUS_VER" } # ---- 业务操作 ---- # [1] 停止 iperf3 服务并关闭开机自启动(幂等,可重复执行) do_stop() { local changed=false echo -e "\n${C_BOLD}▸ [1] 停止服务 + 关闭自启动${C_RESET}" if systemctl stop "$SERVICE" 2>/dev/null; then ok "服务已停止"; changed=true else warn "服务本就未运行,无需操作" fi if systemctl disable "$SERVICE" 2>/dev/null; then ok "开机自启已关闭"; changed=true else warn "自启本就未启用,无需操作" fi if $changed; then echo -e "\n ${C_BLUE}提示:${C_RESET} 操作完成,上方状态栏已更新。" fi } # [2] 彻底卸载 iperf3:停止服务、禁用自启、删除服务文件、卸载软件包 do_purge() { echo -e "\n${C_BOLD}${C_RED}▸ [2] 彻底卸载 iperf3 (含软件包, 不可逆)${C_RESET}" echo read -r -p " 确认彻底卸载 iperf3? (输入 yes 继续): " confirm if [ "$confirm" != "yes" ]; then echo -e " ${C_YELLOW}已取消。${C_RESET}" return fi systemctl stop "$SERVICE" 2>/dev/null systemctl disable "$SERVICE" 2>/dev/null rm -f /usr/lib/systemd/system/"$SERVICE" /lib/systemd/system/"$SERVICE" systemctl daemon-reload 2>/dev/null # 按系统包管理器选择卸载命令 local pkg_ok=false if command -v apt >/dev/null 2>&1; then apt purge -y iperf3 2>&1 | tail -3 && pkg_ok=true elif command -v dnf >/dev/null 2>&1; then dnf remove -y iperf3 2>&1 | tail -3 && pkg_ok=true elif command -v apk >/dev/null 2>&1; then apk del iperf3 2>&1 | tail -3 && pkg_ok=true else warn "未识别的包管理器,请手动卸载 iperf3" pkg_ok=true # 不算失败,服务已清 fi if $pkg_ok; then ok "卸载完成。" else err "包管理器卸载失败,请检查日志。" fi } # [3] 恢复自启动并启动服务(撤销 do_stop 的操作) do_restore() { echo -e "\n${C_BOLD}▸ [3] 恢复自启动并启动服务${C_RESET}" if systemctl enable "$SERVICE" 2>/dev/null; then ok "自启动已恢复" else err "启用失败(服务文件可能已被删除,无法恢复)" fi if systemctl start "$SERVICE" 2>/dev/null; then ok "服务已启动" else err "启动失败" fi } # [4] 显示帮助信息 do_help() { echo -e "\n${C_BOLD}▸ [4] 帮助说明${C_RESET}" echo echo -e " ${C_CYAN}快捷启动:${C_RESET} 终端输入 ${C_GREEN}istop${C_RESET} 即可启动本工具" echo echo -e " ${C_CYAN}一键安装:${C_RESET}" echo -e " ${C_DIM}bash <(curl -fsSL $RAW_URL)${C_RESET}" echo echo -e " ${C_CYAN}选项说明:${C_RESET}" echo -e " ${C_BLUE}[1]${C_RESET} 停止服务 + 关闭自启动 — 最常用, 停掉 iperf3 并禁止开机自启" echo -e " ${C_BLUE}[2]${C_RESET} 彻底卸载 iperf3 (含软件包) — 停止+禁用+删服务文件+卸载软件包 ${C_RED}(不可逆)${C_RESET}" echo -e " ${C_BLUE}[3]${C_RESET} 恢复自启动并启动服务 — 撤销 [1] 的操作" echo -e " ${C_BLUE}[4]${C_RESET} 帮助说明 — 查看本说明" echo -e " ${C_BLUE}[5]${C_RESET} 卸载 istop — 删除本工具 (${C_DIM}$INSTALL_PATH${C_RESET})" echo -e " ${C_BLUE}[0]${C_RESET} 退出" echo echo -e " ${C_DIM}安装后输入 ${C_GREEN}istop${C_DIM} 即可启动。${C_RESET}" } # [5] 卸载 istop 自身(删除安装文件并退出) do_uninstall() { echo -e "\n${C_BOLD}${C_RED}▸ [5] 卸载 istop(删除本工具)${C_RESET}" echo read -r -p " 确认卸载 istop? iperf3 不会被影响 (输入 yes 继续): " confirm if [ "$confirm" != "yes" ]; then echo -e " ${C_YELLOW}已取消。${C_RESET}" return fi rm -f "$INSTALL_PATH" if [ ! -f "$INSTALL_PATH" ]; then ok "istop 已卸载 (iperf3 未受影响)。" echo -e " ${C_DIM}重新安装: bash <(curl -fsSL $RAW_URL)${C_RESET}" exit 0 else err "卸载失败,请手动删除 $INSTALL_PATH" exit 1 fi } # ---- 菜单渲染 ---- show_menu() { clear 2>/dev/null || true echo -e " ${C_BOLD}╔══════════════════════════════════════╗${C_RESET}" echo -e " ${C_BOLD}║ iperf3 服务管理工具 ║${C_RESET}" echo -e " ${C_BOLD}║ 快捷启动: ${C_GREEN}istop${C_BOLD} ║${C_RESET}" echo -e " ${C_BOLD}╚══════════════════════════════════════╝${C_RESET}" echo print_status echo echo -e " ${C_BLUE}[1]${C_RESET} 停止服务 + 关闭自启动" echo -e " ${C_BLUE}[2]${C_RESET} 彻底卸载 iperf3 (含软件包) ${C_RED}[不可逆]${C_RESET}" echo -e " ${C_BLUE}[3]${C_RESET} 恢复自启动并启动服务" echo -e " ${C_BLUE}[4]${C_RESET} 帮助说明" echo -e " ${C_BLUE}[5]${C_RESET} 卸载 istop(删除本工具)" echo -e " ${C_DIM}[0]${C_RESET} 退出" echo } # ---- 主循环 ---- main() { check_system local choice while true; do show_menu read -r -p " 请输入序号 [0-5]: " choice 2>/dev/null || { echo; exit 0; } case "${choice:-}" in 1) do_stop ;; 2) do_purge ;; 3) do_restore ;; 4) do_help ;; 5) do_uninstall ;; 0) echo -e "\n 已退出。${C_RESET}"; exit 0 ;; *) echo -e " ${C_YELLOW}无效选项,请重新输入${C_RESET}" ;; esac echo read -r -p " 按回车返回菜单..." _ done } main