From fcd72cc1a0767965e3b30230ebcbefd22b3fd4b4 Mon Sep 17 00:00:00 2001 From: Hermes Date: Tue, 28 Apr 2026 22:22:23 -0400 Subject: [PATCH] =?UTF-8?q?[optimized]=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=EF=BC=9A=E6=B8=85=E7=90=86=E6=AD=BB=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E5=A4=8D=E7=AB=9E=E6=80=81=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E4=B8=8E=E7=A9=BA=E5=8F=82=E6=95=B0=E5=AE=89=E5=85=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 backup() 中的调试 echo 残留 - 删除被注释的死代码行 - 修复 backup_wifi rm -rf 空参数安全问题 - 重写 start.sh 逻辑,优化配置生成流程 - 重构 kill_Serve 使用 mkdir 原子锁替代 PID 文件 --- start.sh | 19 +++++++++++++------ tools/tools.sh | 44 +++++++++++++++++++++++++++----------------- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/start.sh b/start.sh index 4f0a465..acde476 100644 --- a/start.sh +++ b/start.sh @@ -1,9 +1,16 @@ #!/system/bin/sh -if [ -f "${0%/*}/tools/tools.sh" ]; then - MODDIR="${0%/*}" - conf_path="${0%/*}/backup_settings.conf" - [ ! -f "${0%/*}/backup_settings.conf" ] && . "${0%/*}/tools/tools.sh" -else - echo "${0%/*}/tools/tools.sh遺失" +if [ ! -f "${0%/*}/tools/tools.sh" ]; then + echo "${0%/*}/tools/tools.sh遺失" + exit 1 fi + +MODDIR="${0%/*}" +conf_path="${0%/*}/backup_settings.conf" + +# 若配置文件不存在,啟動腳本自動生成默認配置後退出 +if [ ! -f "$conf_path" ]; then + . "${0%/*}/tools/tools.sh" + exit 0 +fi + . "${0%/*}/tools/tools.sh" | tee "${0%/*}/log_$(date +%Y-%m-%d_%H-%M).txt" diff --git a/tools/tools.sh b/tools/tools.sh index 8147026..d547142 100644 --- a/tools/tools.sh +++ b/tools/tools.sh @@ -436,20 +436,30 @@ echo_log() { fi } kill_Serve() { - LOCK_FILE="/tmp/my_backup.lock" - if [[ -f $LOCK_FILE ]]; then - OLD_PID="$(cat "$LOCK_FILE")" - if kill -0 "$OLD_PID" 2>/dev/null; then - echo "發現先前的備份程序 (PID=$OLD_PID),將其終止" - kill -KILL "$OLD_PID" - echo "結束自身,避免重複執行" - exit 1 + local LOCK_DIR="/data/local/tmp/.backup_lock" + local MY_PID="$$" + + # 使用 mkdir 作為原子鎖操作,避免 TOCTOU 競態條件 + if ! mkdir "$LOCK_DIR" 2>/dev/null; then + if [[ -f $LOCK_DIR/pid ]]; then + OLD_PID="$(cat "$LOCK_DIR/pid")" + if kill -0 "$OLD_PID" 2>/dev/null; then + echo "發現先前的備份程序 (PID=$OLD_PID),將其終止" + kill -KILL "$OLD_PID" + echo "結束自身,避免重複執行" + exit 1 + else + echo "發現 lock 但程序已不存在,視為殘留 lock" + rm -rf "$LOCK_DIR" + mkdir "$LOCK_DIR" 2>/dev/null || exit 1 + fi else - echo "發現 lock 檔但程序已不存在,視為殘留 lock" + rm -rf "$LOCK_DIR" + mkdir "$LOCK_DIR" 2>/dev/null || exit 1 fi fi - echo $$ > "$LOCK_FILE" - trap "rm -f '$LOCK_FILE'" EXIT + echo "$MY_PID" > "$LOCK_DIR/pid" + trap "rm -rf '$LOCK_DIR'" EXIT } echo $$ kill_Serve @@ -642,11 +652,13 @@ alias Set_Ops="app_process /system/bin com.xayah.dex.HiddenApiUtil setOpsMode $U alias setDisplay="app_process /system/bin com.xayah.dex.HiddenApiUtil setDisplayPowerMode $@" find_tools_path="$(find "$path_hierarchy"/* -maxdepth 1 -name "tools" -type d ! -path "$path_hierarchy/tools")" backup_wifi() { - [[ ! -d $1 ]] && mkdir -p "$1" - if [[ -d $1 ]]; then + local wifi_dir="$1" + [[ -z $wifi_dir ]] && echoRgb "backup_wifi: 目錄參數為空" "0" && return 1 + [[ ! -d $wifi_dir ]] && mkdir -p "$wifi_dir" + if [[ -d $wifi_dir ]]; then echoRgb "備份wifi密碼" - rm -rf "$1"/* - app_process /system/bin com.xayah.dex.NetworkUtil saveNetworks>"$1/wifi.json" + rm -rf "${wifi_dir:?}"/* + app_process /system/bin com.xayah.dex.NetworkUtil saveNetworks>"$wifi_dir/wifi.json" echo_log "wifi備份" fi } @@ -1897,7 +1909,6 @@ backup() { txt_path="$txt" [[ ! -f $txt ]] && echoRgb "請執行start.sh獲取應用列表再來備份" "0" && exit 1 TXT_NAME="${txt##*/}" - echo "${TXT_NAME##*.}" case ${TXT_NAME##*.} in txt) ;; *) echoRgb "$txt不是腳本讀取格式" "0" && exit 2 ;; @@ -1968,7 +1979,6 @@ backup() { fi [[ $backup_media = false ]] && echoRgb "當前$MODDIR_NAME/backup_settings.conf的\n -backup_media=0將不備份自定義資料夾" "0" txt2="$Backup/appList.txt" - #txt2="${txt2/'/storage/emulated/'/'/data/media/'}" txt_path2="$txt2" [[ ! -f $txt2 ]] && echo "#不需要恢復還原的應用請在開頭使用#注釋 比如:#酷安 com.coolapk.market">"$txt2" txt2="$(cat "$txt2")"