#!/bin/bash # 显示进度条并执行命令(使用 zenity) run_with_progress() { local title="$1" local text="$2" local cmd="$3" # 检测可用的对话框工具 if ! command -v zenity &> /dev/null; then echo "警告:未找到 zenity,无法显示进度条。直接执行命令..." >&2 eval "$cmd" return $? fi # 启动 zenity 进度条 local progress_pid zenity --progress --pulsate --title="$title" --text="$text" --no-cancel 2>/dev/null & progress_pid=$! # 执行实际命令 eval "$cmd" local cmd_exit=$? # 关闭进度条 kill "$progress_pid" 2>/dev/null wait "$progress_pid" 2>/dev/null return $cmd_exit } # 1. 检查是否提供了至少一个参数 if [[ $# -eq 0 ]]; then echo "错误:未提供命令参数。" echo "用法: $0 [apm|aptss|ssinstall] <子命令> [参数...]" exit 1 fi # 2. 获取第一个参数作为主指令 command_type="$1" # 3. 根据指令类型分发逻辑 case "$command_type" in "apm") # 禁止 apm debug 命令 if [[ "$2" == "debug" ]]; then echo "错误:apm debug 命令已被禁止执行。" echo "提示:如需调试,请使用其他方式。" exit 1 fi # 禁止 apm ssaudit 命令(已弃用,请使用 apm ssinstall) if [[ "$2" == "ssaudit" ]]; then echo "错误:apm ssaudit 命令已被弃用,请使用 apm ssinstall。" echo "提示:请将 APM 升级到 1.2.2 版本以上以继续使用安装功能。" exit 1 fi # 执行 apm 命令(跳过第一个参数) /usr/bin/apm "${@:2}" 2>&1 exit_code=$? # 如果 apm ssinstall 执行失败,提示可能是版本过低 if [[ "$2" == "ssinstall" && "$exit_code" != "0" ]]; then echo "提示:apm ssinstall 执行失败,可能是您的 APM 版本过低(需要 1.2.2+)。" echo "请升级 APM 到 1.2.2 版本以上来继续安装。" fi ;; "ssinstall") # 执行 ssinstall 命令(跳过第一个参数) /usr/bin/ssinstall "${@:2}" --native 2>&1 exit_code=$? if [[ "$exit_code" != "0" ]];then echo "安装失败,可尝试安装对应的 APM 版本应用;若无对应的 APM 版本应用,可提交用户反馈" fi ;; "force-ssinstall") # 强制安装被系统锁定(apt-mark hold)的包:在一次已提权的 pkexec 会话内 # 完成「解除锁定 → ssinstall 本地 .deb → 恢复锁定」,避免单独 pkexec apt-mark # 触发额外权限框(apt-mark 不在 policykit 免密 exec.path 内)。 # 用法:force-ssinstall [ssinstall 额外参数...] pkg="$2" deb="$3" shift 3 # 仅放行单包名(与前端 PKGNAME_PATTERN 一致,双引号防注入) if [[ -z "$pkg" || -z "$deb" ]]; then echo "错误:force-ssinstall 缺少包名或 deb 路径参数。" exit 1 fi # 安装前解除系统锁定(失败仅警告,不阻断) apt-mark unhold "$pkg" 2>&1 || echo "警告:解除系统锁定 $pkg 失败,将继续尝试安装" # 安装本地 .deb(--native 由本分支统一追加) /usr/bin/ssinstall "$deb" "$@" --native 2>&1 exit_code=$? # 安装后无论如何恢复系统锁定,保持用户原本的 hold 状态 apt-mark hold "$pkg" 2>&1 || echo "警告:恢复系统锁定 $pkg 失败,请手动检查" if [[ "$exit_code" != "0" ]]; then echo "安装失败,可尝试安装对应的 APM 版本应用;若无对应的 APM 版本应用,可提交用户反馈" fi exit $exit_code ;; "aptss") # 针对 aptss 的特殊逻辑:如果是 remove 子命令,需要图形化确认 if [[ "$2" == "remove" ]]; then packages="${@:3}" # 确认框通用参数 title="确认卸载" text="正在准备卸载: $packages\n\n若这是您下达的卸载指令,请选择确认继续卸载" # 使用 zenity 确认 if command -v zenity &> /dev/null; then zenity --question --title="$title" --text="$text" \ --ok-label="确认卸载" --cancel-label="取消" --width=400 confirmed=$? else echo "错误:未找到 zenity,无法显示确认对话框。卸载操作已拒绝。" exit 1 fi # 根据确认结果执行 if [[ $confirmed -eq 0 ]]; then /usr/bin/aptss "${@:2}" -y 2>&1 exit_code=$? else echo "操作已取消" exit 0 fi elif [[ "$2" == "install" ]]; then packages="${@:3}" # 确认框通用参数 title="确认安装" text="正在准备安装: $packages\n\n若这是您下达的安装指令,请选择确认继续安装" # 使用 zenity 确认 if command -v zenity &> /dev/null; then zenity --question --title="$title" --text="$text" \ --ok-label="确认安装" --cancel-label="取消" --width=400 confirmed=$? else echo "错误:未找到 zenity,无法显示确认对话框。安装操作已拒绝。" exit 1 fi # 根据确认结果执行 if [[ $confirmed -eq 0 ]]; then # 1) 先更新软件源(带进度条) echo "正在更新软件源..." if ! run_with_progress "更新软件源" "正在更新软件源,请稍候..." "/usr/bin/aptss update"; then echo "错误:软件源更新失败,安装已终止。" exit 1 fi # 2) 执行安装(带进度条) echo "正在安装软件包..." if ! run_with_progress "安装软件包" "正在安装: $packages,请稍候..." "/usr/bin/aptss install $packages -y"; then echo "错误:软件包安装失败。" exit 1 fi exit_code=0 else echo "操作已取消" exit 0 fi elif [[ "$2" == "ssupdate" ]]; then /usr/bin/aptss "${@:2}" -y 2>&1 exit_code=$? exit $exit_code else # 非 remove/install 命令,拒绝执行 echo "拒绝执行 aptss 白名单外的指令" exit 1 fi ;; *) # 兜底:拒绝非法指令 echo "拒绝执行:仅允许执行 'apm', 'aptss' 或 'ssinstall'。收到的参数: '$command_type'" exit 1 ;; esac exit $exit_code