Compare commits
41 Commits
2025081622
...
rainycy-sn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d286c7cacc | ||
|
|
63037d9e5a | ||
|
|
05130a9898 | ||
|
|
debf83a88c | ||
|
|
e31c31515c | ||
|
|
3dc8bbdb2b | ||
|
|
8509e3ec2b | ||
|
|
ff47576425 | ||
|
|
4cf1e61321 | ||
|
|
43b8886642 | ||
|
|
ed13786ef3 | ||
|
|
6eb10531a4 | ||
|
|
c207998028 | ||
|
|
27d8134ae9 | ||
|
|
22982ac1ce | ||
|
|
550e2a760b | ||
|
|
7113448bb5 | ||
|
|
6e1a8a2da3 | ||
|
|
b2409700c5 | ||
|
|
0bc0b95398 | ||
|
|
6fb53d7f11 | ||
|
|
c7920acd0c | ||
|
|
384f039f43 | ||
|
|
80c2b47607 | ||
|
|
7832fd6d8e | ||
|
|
ad52ebd1a1 | ||
|
|
6f287f42b8 | ||
|
|
9a1c30a583 | ||
|
|
37047dcd8b | ||
|
|
7d9c90cc8c | ||
|
|
5201bdac28 | ||
|
|
0e524b407d | ||
|
|
102c3fd2ba | ||
|
|
da224d6c92 | ||
|
|
304d4d5b57 | ||
|
|
fcd72cc1a0 | ||
|
|
dfef750e5c | ||
|
|
2fe35e5a35 | ||
|
|
e64fa5d6b9 | ||
|
|
32b023373f | ||
|
|
656d85a19f |
16
.codegraph/.gitignore
vendored
Normal file
16
.codegraph/.gitignore
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
# CodeGraph data files
|
||||
# These are local to each machine and should not be committed
|
||||
|
||||
# Database
|
||||
*.db
|
||||
*.db-wal
|
||||
*.db-shm
|
||||
|
||||
# Cache
|
||||
cache/
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
|
||||
# Hook markers
|
||||
.dirty
|
||||
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
# IDE
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
491
README.md
491
README.md
@@ -1,124 +1,445 @@
|
||||
# Backup_script 數據備份腳本
|
||||
[](https://github.com/YAWAsau)
|
||||
[](https://github.com/YAWAsau/backup_script/releases)
|
||||
[](https://github.com/YAWAsau/backup_script/releases/latest)
|
||||
[](https://choosealicense.com/licenses/gpl-3.0)
|
||||
[](https://t.me/yawasau_script)
|
||||
|
||||
## 概述
|
||||
<p align="center">
|
||||
<a href="https://github.com/YAWAsau/backup_script/stargazers"><img src="https://img.shields.io/github/stars/YAWAsau/backup_script?label=stars&style=flat-square" /></a>
|
||||
<a href="https://github.com/YAWAsau/backup_script/releases"><img src="https://img.shields.io/github/downloads/YAWAsau/backup_script/total?style=flat-square" /></a>
|
||||
<a href="https://github.com/YAWAsau/backup_script/releases/latest"><img src="https://img.shields.io/github/v/release/YAWAsau/backup_script?label=release&style=flat-square" /></a>
|
||||
<a href="https://choosealicense.com/licenses/gpl-3.0"><img src="https://img.shields.io/github/license/YAWAsau/backup_script?label=License&style=flat-square" /></a>
|
||||
<a href="https://t.me/yawasau_script"><img src="https://img.shields.io/badge/Follow-Telegram-blue.svg?logo=telegram&style=flat-square" /></a>
|
||||
</p>
|
||||
|
||||
創作該腳本是為了使用戶能夠更加完整地**備份/恢復**應用數據,
|
||||
支援設備必須符合以下條件:`Android 8+`+`arm64`。
|
||||
---
|
||||
|
||||
由於本人是台灣人所以發布的版本為繁體版
|
||||
(CN系統將自動翻譯自身腳本為簡體中文)
|
||||
## 📖 概述
|
||||
|
||||
一款專為 Android 設計的完整應用數據備份/恢復 Shell 腳本,支援 SSAID、運行時權限、OBB 數據包、WiFi 設定等完整備份,讓你換機換系統後能無縫還原所有應用狀態。
|
||||
|
||||
## 優勢
|
||||
新版增加**完整的遠端備份系統**,支援 WebDAV / SMB 上傳到 NAS / 雲端 / 區網電腦,並可從遠端下載備份回手機直接恢復。支援**流式備份模式**,邊壓縮邊傳輸,數據完全不佔用本機空間。
|
||||
|
||||
- 數據完整:在更換系統之後,原有的數據全部保留,無需重新登陸或者下載額外數據包。
|
||||
- 支援備份SSAID 可完美備份LINE
|
||||
- 支援備份應用權限 可備份運行時權限與ops權限
|
||||
- 易操作:簡單几步即可備份應用完整數據!
|
||||
- 限制少:不限制機型,可跨安桌版本。
|
||||
- 功能強:可備份恢復`split apk`。
|
||||
- 算法多:目前支持的壓縮算法有 `tar(默認)`
|
||||
- `zstd`。
|
||||
- 速度快:即使使用`zstd`壓縮算法速率依舊快速(對比鈦備份 swift backup)。
|
||||
- 腳本自帶tools完整性效驗與壓縮包效驗
|
||||
## 如何使用
|
||||
`請認真閱讀以下說明,以減少不必要的問題`
|
||||
> 作者為台灣人,預設發布繁體版本。CN 系統環境下腳本將自動翻譯為簡體中文。
|
||||
|
||||
##### 推薦工具:[`MT管理器`](https://www.coolapk.com/apk/bin.mt.plus),若使用`Termux`,則請勿使用`tsu`。
|
||||
**系統需求:** `Android 8+` · `arm64 架構` · `Root 權限(Magisk / KernelSU)`
|
||||
|
||||
#### !!!以下操作皆須ROOT!!! ####
|
||||
---
|
||||
|
||||
1. 首先將下載到的腳本解壓到任意目錄後,可以看到以下目錄結構 警告! 不論備份或是恢復都必須保證tools的存在與完整性 否則腳本失效或是二進制調用失敗。
|
||||
## ✨ 功能特色
|
||||
|
||||
| 功能 | 說明 |
|
||||
|------|------|
|
||||
| 📦 完整數據備份 | 換機換系統後原有數據完整保留,無需重新登入或下載額外數據包 |
|
||||
| 🔑 SSAID 備份 | 支援 SSAID 備份,可完美備份 LINE 等依賴設備識別碼的應用 |
|
||||
| 🛡️ 權限備份 | 支援備份運行時權限(Runtime Permission)與 ops 權限 |
|
||||
| 📂 Split APK | 支援備份與恢復 Split APK 格式 |
|
||||
| 🎮 OBB 數據包 | 可選備份外部 OBB 數據(如原神、王者榮耀等大型遊戲) |
|
||||
| 📡 WiFi 備份 | 支援備份與恢復 WiFi 設定 |
|
||||
| 📁 自定義資料夾備份 | 可備份 DCIM、Download、Music 等任意自定義目錄 |
|
||||
| 🗜️ 多種壓縮算法 | 支援 `tar`(僅打包)與 `zstd`(高壓縮率高速度) |
|
||||
| ⚡ 高速壓縮 | zstd 壓縮速率快速,優於鈦備份、Swift Backup |
|
||||
| 🔒 完整性校驗 | 內建 tools SHA-256 校驗與壓縮包完整性驗證 |
|
||||
| 🔄 增量備份 | 多維度比對(版本/大小/權限/SSAID),無變化則跳過 |
|
||||
| ✅ 最終計數核驗 | 備份結束後逐檔核對存在性,三態顯示結果 |
|
||||
| 🖥️ 後台執行 | 支援後台執行模式,可完全關閉終端,log 持續刷新 |
|
||||
| 💡 偽裝亮屏 | 備份/恢復期間可偽裝亮屏,避免 IO 因息屏降速 |
|
||||
| 🌐 自動更新 | 聯網偵測最新版本,支援 CDN 節點(適合中國大陸用戶) |
|
||||
| 🌏 多語言 | 自動識別系統語言環境,支援繁體中文/簡體中文自動切換 |
|
||||
| 👥 多用戶支援 | 支援多用戶環境(user 0、999 等),可手動或自動選擇用戶 |
|
||||
| ⬛ 黑名單模式 | 黑名單應用可選「完全忽略」或「僅備份安裝包」 |
|
||||
| ⬜ 白名單支援 | 支援預裝應用白名單與系統應用白名單,可指定備份範圍 |
|
||||
| 📱 進程偵測 | 可設定忽略正在運行中的應用,避免備份數據不一致 |
|
||||
| ☁️ 遠程備份上傳 | 支援 WebDAV / SMB 兩種協議,備份完成自動上傳,智能增量 |
|
||||
| 🚀 流式備份 | 邊壓縮邊傳輸,數據不落本機,節省本地空間 |
|
||||
| 📥 遠程下載恢復 | 可從遠端直接下載備份回手機,點 start.sh 即可恢復 |
|
||||
| 🔍 區網掃描 | 自動掃描區網內所有 SMB 主機,免去手動找 IP |
|
||||
| 🧪 連線測試 | 三層測試(TCP / 認證 / 路徑),設定不需備份就能驗證 |
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ 主選單功能
|
||||
|
||||
### 備份模式
|
||||
|
||||
| 選項 | 功能 |
|
||||
|------|------|
|
||||
| 生成應用列表 | 掃描已安裝的第三方應用並生成 `appList.txt` |
|
||||
| 備份應用 | 根據列表與設定完整備份應用數據 |
|
||||
| 備份已更新應用 | 僅備份自上次備份以來有版本更新的應用 |
|
||||
| 備份自定義資料夾 | 備份 `backup_settings.conf` 內設定的自定義目錄 |
|
||||
| 備份 WiFi | 備份當前設備的 WiFi 設定 |
|
||||
| 測試遠端連線 | 驗證 WebDAV / SMB 設定,三層測試(TCP / 認證 / 路徑) |
|
||||
| 單獨上傳當前備份 | 上傳現有本地備份到遠端,不重新跑備份流程 |
|
||||
| 列出遠端備份 | 連線遠端、產生 `appList_network.txt` 讓你勾選要下載哪些 app |
|
||||
| 從遠端下載備份 | 依清單下載備份到本地,可直接執行恢復 |
|
||||
| 殺死運行中腳本 | 安全終止正在執行的備份腳本(整棵進程樹) |
|
||||
|
||||
### 恢復模式
|
||||
|
||||
| 選項 | 功能 |
|
||||
|------|------|
|
||||
| 重新生成應用列表 | 刷新恢復資料夾內的 `appList.txt` |
|
||||
| 恢復備份 | 根據列表完整恢復應用與數據 |
|
||||
| 僅恢復包含 SSAID 應用(含數據) | 只恢復有 SSAID 的應用及其完整數據 |
|
||||
| 僅恢復包含 SSAID 應用(不含數據) | 只套用 SSAID,不覆蓋現有數據 |
|
||||
| 恢復自定義資料夾 | 恢復備份的自定義目錄 |
|
||||
| 恢復 WiFi | 恢復已備份的 WiFi 設定 |
|
||||
| 壓縮檔完整性檢查 | 驗證備份壓縮包是否完整無損 |
|
||||
| 轉換文件夾名稱 | 將備份資料夾名稱格式轉換(用於跨版本相容) |
|
||||
| 殺死運行中腳本 | 安全終止正在執行的恢復腳本 |
|
||||
|
||||
---
|
||||
|
||||
## 📁 目錄結構
|
||||
|
||||
`這是腳本結構與說明`
|
||||
```
|
||||
backup_script.zip
|
||||
│
|
||||
├── tools
|
||||
│ ├── Device_List
|
||||
│ ├── bc
|
||||
│ ├── busybox
|
||||
│ ├── classes.dex
|
||||
│ ├── cmd
|
||||
│ ├── jq
|
||||
│ ├── find
|
||||
│ ├── keycheck
|
||||
│ ├── soc.json
|
||||
│ ├── tar
|
||||
│ ├── tools.sh
|
||||
│ ├── zip
|
||||
│ └── zstd
|
||||
├── backup_settings.conf <--- 腳本默認行為設置
|
||||
└── start.sh <--- 執行腳本
|
||||
├── tools/
|
||||
│ ├── busybox # 核心工具集
|
||||
│ ├── zstd # zstd 壓縮工具
|
||||
│ ├── tar # tar 打包工具
|
||||
│ ├── curl # 遠程傳輸工具 (WebDAV)
|
||||
│ ├── smbclient # SMB 遠程傳輸
|
||||
│ ├── jq # JSON 處理
|
||||
│ ├── find # 文件搜索
|
||||
│ ├── keycheck # 音量鍵監聽
|
||||
│ ├── cmd # 系統指令橋接
|
||||
│ ├── classes.dex # Java 功能擴展(詳見下方說明)
|
||||
│ ├── soc.json # 處理器資料庫
|
||||
│ ├── Device_List # 設備型號資料庫
|
||||
│ └── tools.sh # 核心腳本
|
||||
│
|
||||
├── backup_settings.conf # 備份行為設定檔
|
||||
└── start.sh # 主執行腳本
|
||||
```
|
||||
|
||||
2. 然後執行`start.sh`腳本音量鍵選擇生成應用列表,等待腳本輸出提示結束,此時會在當前目錄生成一個`appList.txt`,這就是你當前安裝的所有第三方應用(腳本會屏蔽預裝應用,可於backup_settings.conf設置需要備份包名)。
|
||||
> ⚠️ **重要:** 無論備份或恢復,都必須確保 `tools/` 目錄完整存在,否則腳本將無法正常運作。
|
||||
|
||||
3. 現在打開生成的`appList.txt`,根據裏面的提示操作後保存,這樣你就設置好了需要備份的軟件。
|
||||
備份完成後,每個 app 子目錄會額外生成 `backup.sh` / `recover.sh` / `upload.sh`,可單獨備份、恢復或上傳單一應用。
|
||||
|
||||
4. 最後找到`backup_settings.conf`打開後根據提示設置保存,再打開`start.sh`,音量鍵選擇備份應用,備份結束完成後會在當前目錄生成一個以`Backup_壓縮算法名`命名的資料夾,裡面就是你的軟件備份。把這個資料夾整個保持到其他位置,刷完機后複製回手機,直接執行`Backup_壓縮算法名/start.sh`即可恢復備份的所有數據,同樣道理,裡面也有個`appList.txt`,使用方法跟第3步驟一樣,不需要還原的刪除即可,另外進去備份好的資料夾找到單獨應用資料夾有個 backup.sh and recover.sh可以單獨備份與恢復腳本。
|
||||
---
|
||||
|
||||
5. 腳本執行過程中請留意紅色字眼提示有無任何錯誤,並且使用恢復腳本時留意恢復結束後是否提示應用存在ssaid,假設提示存在ssaid請在恢復後立刻重啟已便套用ssaid,假設恢復ssaid後立刻打開應用會導致ssaid套用失敗,因為Android會產生一個新的saaid,如此會導致應用卡白屏或是提示需要登錄,ssaid是判斷應用是否換過環境與設備的判斷之一,保持一致可以減少諸如提示異地登錄或是需要重新登入驗證的方法。
|
||||
## ⚙️ 設定檔說明(backup_settings.conf)
|
||||
|
||||
| 設定項 | 說明 | 預設值 |
|
||||
|--------|------|--------|
|
||||
| `Lo` | 操作方式:`0` 音量鍵 / `1` 音量鍵(強制) / `2` 鍵盤輸入 | `0` |
|
||||
| `background_execution` | 後台執行:`1` 可關閉終端 / `0` 需保持終端開啟 | `0` |
|
||||
| `setDisplayPowerMode` | 備份期間偽裝亮屏防止 IO 降速 | `0` |
|
||||
| `Shell_LANG` | 語言:`0` 繁體中文 / `1` 簡體中文(留空自動偵測) | 自動 |
|
||||
| `Output_path` | 自定義備份輸出路徑(留空使用當前目錄) | 空 |
|
||||
| `list_location` | 自定義 appList.txt 位置(留空使用當前目錄) | 空 |
|
||||
| `update` | 自動更新:`1` 開啟 / `0` 關閉 | `1` |
|
||||
| `cdn` | 更新 CDN 節點:`0` 直連 / `1` ghfast.top / `2` workers.dev | `1` |
|
||||
| `mount_point` | 屏蔽外部掛載點,多個用 `\|` 分隔 | `rannki\|0000-1` |
|
||||
| `user` | 指定用戶 ID(留空自動選擇) | 空 |
|
||||
| `Backup_Mode` | 備份模式:`1` 應用+數據 / `0` 僅安裝包 | `1` |
|
||||
| `Backup_user_data` | 備份 user 數據:`1` 是 / `0` 否 | `1` |
|
||||
| `Backup_obb_data` | 備份 OBB 外部數據:`1` 是 / `0` 否 | `1` |
|
||||
| `backup_media` | 備份完成後一併備份自定義資料夾 | `0` |
|
||||
| `Background_apps_ignore` | 忽略正在運行中的應用:`1` 忽略 / `0` 備份 | `0` |
|
||||
| `Custom_path` | 自定義備份目錄列表(絕對路徑,每行一個) | DCIM / Download 等 |
|
||||
| `blacklist_mode` | 黑名單模式:`1` 完全忽略 / `0` 僅備份安裝包 | `0` |
|
||||
| `blacklist` | 黑名單應用包名列表 | 空 |
|
||||
| `whitelist` | 預裝應用白名單包名列表 | 小米系列預裝 |
|
||||
| `system` | 系統應用白名單包名列表 | Google 系列 |
|
||||
| `Compression_method` | 壓縮算法:`zstd` 或 `tar` | `zstd` |
|
||||
| `rgb_a` / `rgb_b` / `rgb_c` | 終端輸出主色/輔色1/輔色2(256 色代碼) | `220` / `51` / `213` |
|
||||
| `remote_type` | 遠程備份協議:`webdav` / `smb`(留空不啟用) | 空 |
|
||||
| `smb_url` | SMB 伺服器地址 | 空 |
|
||||
| `smb_remote_user` | SMB 認證用戶名 | 空 |
|
||||
| `smb_remote_pass` | SMB 認證密碼 | 空 |
|
||||
| `webdav_url` | WebDAV 伺服器地址 | 空 |
|
||||
| `webdav_remote_user` | WebDAV 認證用戶名 | 空 |
|
||||
| `webdav_remote_pass` | WebDAV 認證密碼 | 空 |
|
||||
| `remote_keep_local` | 上傳成功後本地檔案:`1` 保留 / `0` 刪除 | `0` |
|
||||
| `remote_stream` | 流式備份:`1` 開啟(邊壓邊傳,不佔本機) / `0` 關閉 | `0` |
|
||||
|
||||
##### 附加說明:如何恢復 以下是關於恢復資料夾內的文件說明?
|
||||
---
|
||||
|
||||
1. 找到恢復資料夾內的appList.txt打開 編輯列表 保存退出
|
||||
## 🚀 使用方式
|
||||
|
||||
2. 找到start.sh 給予root音量鍵選擇恢復備份後等待腳本結束即可
|
||||
> 推薦使用 [MT 管理器](https://www.coolapk.com/apk/bin.mt.plus) 執行腳本。若使用 Termux,請勿使用 `tsu`。
|
||||
|
||||
3. start.sh的重新生成應用列表功能可用於刷新appList.txt內的列表 使用時機為當你刪除列表內的任何應用備份時,抑或者是恢復備份提示列表錯誤時
|
||||
### 備份流程
|
||||
|
||||
4. start.sh的終止腳本功能用於突然想要終止腳本或是意外操作時使用 同理備份也有一個,因為腳本無須後台特性不能使用常規手段終結,故此另外寫了一個終止
|
||||
**Step 1 — 生成應用列表**
|
||||
|
||||
解壓腳本後執行 `start.sh`,選擇「**生成應用列表**」。執行完畢後,當前目錄會生成 `appList.txt`。
|
||||
|
||||
# 關於如何更新腳本?
|
||||
- 目前有三種更新方法,有下列方式
|
||||
- 1.手動將下載的備份腳本zip不解壓縮直接放到腳本任意目錄(不包括tools目錄內)的任意地方執行任何腳本即可更新,腳本將提示
|
||||
- 2.此備份的任何腳本在執行時均會聯網檢測腳本版本,當更新時會自己提示與下載,根據腳本提示操作的即可(conf update=1時生效),腳本聯網僅作為檢查更新用途,無任何非法操作亦或是下發格機
|
||||
- 3.將下載的壓縮包不解壓縮直接放在/storage/emulated/0/Download腳本自動檢測更新,並按照提示操作即可
|
||||
- 4.在QQ群內下載的腳本不解壓縮腳本會自己檢測更新
|
||||
**Step 2 — 編輯應用列表**
|
||||
|
||||
## 關於反饋
|
||||
- 如果使用過程中出現問題,請攜帶截圖並詳細說明問題,建立 [issues](https://github.com/YAWAsau/backup_script/issues)。
|
||||
- 酷安 @[落葉淒涼TEL](http://www.coolapk.com/u/2277637)
|
||||
- QQ組 976613477 很少上 盡量來TG
|
||||
- TG https://t.me/yawasau_script
|
||||
打開 `appList.txt`,根據需求調整:
|
||||
- 行首加 `#`:注釋掉該應用,不備份
|
||||
- 行首加 `!`:僅備份安裝包,不備份數據
|
||||
|
||||
## 答疑
|
||||
- 一個shell腳本內為什麼有dex?
|
||||
- dex用來實現腳本難以實現的目的,目前saaid備份恢復,備份恢復運行時權限與ops權限,下載與訪問GitHub api來檢查腳本更新,列出使用者應用名稱與包名,繁體轉簡體均為dex的功能,感謝[Android-DataBackup](https://github.com/XayahSuSuSu/Android-DataBackup) by [XayahSuSuSu](https://github.com/XayahSuSuSu)
|
||||
**Step 3 — 設置備份選項**
|
||||
|
||||
## 常見問題
|
||||
打開 `backup_settings.conf`,根據上方設定說明調整各選項後儲存。
|
||||
|
||||
Q1:批量備份大量提示失敗怎麼辦?
|
||||
A1:退出腳本,刪除/data/backup_tools,再備份一次
|
||||
**Step 4 — 執行備份**
|
||||
|
||||
Q2:批量恢復大量提示失敗怎麼辦?
|
||||
A2:退出腳本,按照上面同樣操作。 如果還是錯誤,請建立issues,我幫你排除錯誤
|
||||
執行 `start.sh`,選擇「**備份應用**」。備份完成後生成 `Backup_<壓縮算法>_<用戶ID>/` 資料夾。
|
||||
|
||||
Q3:微信/QQ 能不能完美備份&恢復數據?
|
||||
A3:不能保證,有的人說不能有的人說能,所以備份會有提示。 建議用你信賴的備份軟件針對微信/QQ再備份一次,以防丟失重要數據
|
||||
---
|
||||
|
||||
Q4:為什麼部分應用備份很久? 例如王者榮耀、PUBG、原神、微信、QQ。
|
||||
A4:因為連同軟件數據包都給你備份了,例如原神數據包9GB+,當然久到裂開了,恢復也是同理,還要解壓縮數據包
|
||||
### 恢復流程
|
||||
|
||||
Q5:腳本每次備份都是全新備份嗎?
|
||||
A5;腳本備份時會比對上次備份時的備份SIZE大小 如果有差異就備份,反之忽略備份節省時間
|
||||
**Step 1 — 編輯恢復列表**
|
||||
|
||||
備份腳本耗費了我大量時間與精力 如果你覺得好用,可以捐贈XD
|
||||
.(https://paypal.me/YAWAsau?country.x=TW&locale.x=zh_TW))
|
||||
進入備份資料夾,打開 `appList.txt`,刪除或注釋不需要恢復的應用行。
|
||||
|
||||
**Step 2 — 執行恢復**
|
||||
|
||||
## 銘謝貢獻
|
||||
- 臭批老k([kmou424](https://github.com/kmou424)):提供部分與驗證函數思路
|
||||
- 屑老方([雄氏老方](http://www.coolapk.com/u/665894)):提供自動更新腳本方案
|
||||
- 胖子老陳(雨季騷年)
|
||||
- XayahSuSuSu([XayahSuSuSu](https://github.com/XayahSuSuSu)):提供App支持,dex支持
|
||||
執行備份資料夾內的 `start.sh`,選擇「**恢復備份**」,等待腳本完成。
|
||||
|
||||
`文檔編輯:Petit-Abba, YuKongA`
|
||||
**Step 3 — 注意 SSAID**
|
||||
|
||||
若恢復結束後提示應用存在 SSAID,請**立刻重啟**後再開啟應用。若先開啟應用,Android 會生成新的 SSAID,導致應用白屏或需要重新登入。
|
||||
|
||||
> 💡 備份資料夾內每個應用子目錄都有獨立的 `backup.sh`、`recover.sh`、`upload.sh`,可單獨操作單一應用。
|
||||
|
||||
---
|
||||
|
||||
## ☁️ 遠程備份
|
||||
|
||||
### 設定方式
|
||||
|
||||
編輯 `backup_settings.conf`,SMB 與 WebDAV 地址分開設定,切換協議免重輸:
|
||||
|
||||
```conf
|
||||
remote_type=smb
|
||||
|
||||
smb_url=smb://192.168.1.100/Backup
|
||||
smb_remote_user=用戶名
|
||||
smb_remote_pass=密碼
|
||||
|
||||
webdav_url=http://192.168.1.100:8080/dav/
|
||||
webdav_remote_user=用戶名
|
||||
webdav_remote_pass=密碼
|
||||
|
||||
remote_keep_local=0
|
||||
remote_stream=0
|
||||
```
|
||||
|
||||
| 協議 | 地址格式 | 適用場景 |
|
||||
|------|----------|---------|
|
||||
| SMB | `smb://192.168.1.100/share/` | Windows 共享 / Samba / NAS |
|
||||
| WebDAV | `http://192.168.1.100:8080/dav/` | NAS / Nextcloud / rclone serve |
|
||||
|
||||
### 遠端目錄結構
|
||||
|
||||
腳本在 `remote_url` 下自動建立 `Backup_<壓縮算法>_<用戶ID>/`,與本地結構完全鏡像:
|
||||
|
||||
```
|
||||
smb://NAS/Backup/
|
||||
Backup_zstd_0/
|
||||
1DM+/
|
||||
LINE/
|
||||
Keep記事/
|
||||
wifi/wifi.json
|
||||
tools/
|
||||
start.sh
|
||||
restore_settings.conf
|
||||
appList.txt
|
||||
MT管理器.apk
|
||||
```
|
||||
|
||||
不同用戶(0、999)自動分開到 `Backup_zstd_0/`、`Backup_zstd_999/`,互不衝突。
|
||||
|
||||
### 特性
|
||||
|
||||
- **智能增量** — 多維度比對(版本/大小/權限/SSAID),只上傳本次有變更的 app
|
||||
- **遠端預掃** — 單次連線取全部列表 + 批量下載 json,主循環零網路開銷
|
||||
- **流式備份** — `remote_stream=1` 邊壓縮邊傳輸,數據完全不佔本機空間
|
||||
- **最終核驗** — 備份結束後逐檔核對存在性,缺失檔案列出清單
|
||||
- **連線預檢** — 沒網路時 3 秒內判斷並停用上傳,不卡死腳本
|
||||
- **失敗保護** — 流式上傳失敗不更新遠端 json,確保下輪整體重備
|
||||
|
||||
---
|
||||
|
||||
### 流式備份模式
|
||||
|
||||
`remote_stream=1` 啟用流式備份,數據直接 `tar | zstd | 傳輸`,本機不產生任何備份檔案:
|
||||
|
||||
```conf
|
||||
remote_type=smb
|
||||
smb_url=smb://192.168.1.100/Backup
|
||||
smb_remote_user=用戶名
|
||||
smb_remote_pass=密碼
|
||||
remote_stream=1
|
||||
```
|
||||
|
||||
> ⚠️ 流式模式為全量上傳(無本機校驗),建議搭配穩定的區網環境使用。
|
||||
|
||||
---
|
||||
|
||||
### 從遠端下載備份
|
||||
|
||||
**Step 1** — 主選單選「**列出遠端備份**」,產生 `appList_network.txt`
|
||||
|
||||
**Step 2** — 打開 `appList_network.txt`,用 `#` 註解掉不要下載的 app
|
||||
|
||||
**Step 3** — 主選單選「**從遠端下載備份**」,下載完成後直接執行內附 `start.sh` 恢復
|
||||
|
||||
---
|
||||
|
||||
### 連線測試
|
||||
|
||||
設定完 `backup_settings.conf` 後,主選單選「**測試遠端連線**」:
|
||||
|
||||
```
|
||||
—————— TCP 連線測試 ——————
|
||||
目標: 192.168.1.100:445
|
||||
TCP 連線通過
|
||||
—————— 認證與列目錄測試 ——————
|
||||
SMB 認證通過, share 可存取
|
||||
全部測試通過, 可以開始備份
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 腳本更新方式
|
||||
|
||||
1. **ZIP 放置更新**:將下載的 `.zip` 不解壓,直接放到腳本任意目錄(`tools/` 除外),執行任何腳本即自動更新
|
||||
2. **聯網自動更新**:腳本執行時自動連線 GitHub API 檢查版本(需設置 `update=1`)
|
||||
3. **Download 目錄**:將 `.zip` 放置於 `/storage/emulated/0/Download/`,腳本自動偵測並更新
|
||||
4. **QQ 群下載**:從 QQ 群下載的腳本不解壓,直接放置後執行即可自動更新
|
||||
|
||||
> 🔒 腳本聯網**僅用於檢查更新**,無任何資料收集或非法操作。
|
||||
|
||||
---
|
||||
|
||||
## ❓ 常見問題
|
||||
|
||||
<details>
|
||||
<summary><b>Q1:批量備份/恢復大量提示失敗?</b></summary>
|
||||
|
||||
退出腳本,刪除 `/data/backup_tools/` 目錄後重新執行。若問題持續,請建立 [Issue](https://github.com/YAWAsau/backup_script/issues) 並附上截圖與 log。
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q2:微信/QQ 能完美備份恢復嗎?</b></summary>
|
||||
|
||||
無法保證。建議同時使用其他你信賴的備份工具針對微信/QQ 額外備份,以防丟失重要數據。
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q3:為什麼部分應用備份很久?</b></summary>
|
||||
|
||||
腳本會一同備份應用的 OBB 數據包,例如原神數據包超過 9GB。可在 `backup_settings.conf` 設置 `Backup_obb_data=0` 跳過 OBB 備份。
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q4:腳本每次都是全量備份嗎?</b></summary>
|
||||
|
||||
否。腳本多維度比對上次備份(版本號/數據大小/權限/SSAID),無差異則跳過,節省時間與空間。
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q5:為什麼腳本內包含 .dex 檔案?</b></summary>
|
||||
|
||||
`classes.dex` 用於實現 Shell 腳本難以達成的功能:
|
||||
|
||||
- SSAID 備份與恢復
|
||||
- 運行時權限(Runtime Permission)與 ops 權限批量備份恢復
|
||||
- GitHub API 更新版本檢查與下載
|
||||
- 應用名稱與包名查詢
|
||||
- 繁體中文 ↔ 簡體中文自動翻譯
|
||||
- 後台執行模式的推送通知
|
||||
|
||||
感謝 [XayahSuSuSu](https://github.com/XayahSuSuSu) 的 [Android-DataBackup](https://github.com/XayahSuSuSu/Android-DataBackup) 提供 App 支持。
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q6:息屏後備份速度變慢?</b></summary>
|
||||
|
||||
這是 Android 內核的 IO 節能機制。建議在 `backup_settings.conf` 設置 `setDisplayPowerMode=1` 開啟偽裝亮屏,或備份期間保持螢幕常亮。
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q7:如何單獨備份/恢復/上傳單一應用?</b></summary>
|
||||
|
||||
進入備份資料夾內對應的應用子目錄,直接執行:
|
||||
- `backup.sh` — 單獨備份該 app
|
||||
- `recover.sh` — 單獨恢復該 app
|
||||
- `upload.sh` — 單獨上傳該 app 到遠端
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q8:WebDAV 上傳顯示 HTTP 423 Locked?</b></summary>
|
||||
|
||||
某些雲端網盤的 WebDAV 對大檔有大小限制。建議改用:
|
||||
- 自家 NAS / Windows SMB
|
||||
- rclone serve webdav
|
||||
- 群暉 / Nextcloud
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q9:WebDAV 上傳顯示 HTTP 404?</b></summary>
|
||||
|
||||
請檢查:
|
||||
- `webdav_url` 路徑是否含正確的 webdav 端點(例如 `/dav/` 或 `/remote.php/webdav/`)
|
||||
- 帳號是否有寫入權限
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q10:SMB 提示「找不到 share」?</b></summary>
|
||||
|
||||
- Windows 端確認 SMB 共享已開啟,且網路設成「私人」而非「公用」
|
||||
- 防火牆放行 445 port
|
||||
- 主選單啟動時的 `scan_smb` 會自動列出區網 SMB 主機與 share 名,可對照確認
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q11:沒網路會影響備份嗎?</b></summary>
|
||||
|
||||
不會。腳本啟動時做 TCP 預檢(3 秒內判斷),沒網路時自動停用遠端上傳但**完整保留本地備份**,流程繼續跑完。
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Q12:流式備份和一般備份有什麼差別?</b></summary>
|
||||
|
||||
| | 一般備份 | 流式備份 |
|
||||
|---|---|---|
|
||||
| 本機空間佔用 | 先壓縮到本機再上傳 | 不佔用(直接傳輸) |
|
||||
| 增量比對 | ✅ 支援 | ✅ 支援 |
|
||||
| 本機完整性校驗 | ✅ 支援 | ❌ 不支援(信任傳輸) |
|
||||
| 適合場景 | 本機空間充足 | 本機空間有限 |
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## 📬 問題反饋
|
||||
|
||||
遇到問題請攜帶截圖與 log 檔,透過以下方式反饋:
|
||||
|
||||
- 🐛 [GitHub Issues](https://github.com/YAWAsau/backup_script/issues)
|
||||
- 💬 [Telegram 頻道](https://t.me/yawasau_script)
|
||||
- 🐧 QQ 群:`976613477`
|
||||
- 🧊 酷安:[@落葉淒涼TEL](http://www.coolapk.com/u/2277637)
|
||||
|
||||
---
|
||||
|
||||
## ☕ 支持作者
|
||||
|
||||
備份腳本耗費了大量時間與精力,如果你覺得好用,歡迎贊助支持!
|
||||
|
||||
[](https://paypal.me/YAWAsau?country.x=TW&locale.x=zh_TW)
|
||||
|
||||
---
|
||||
|
||||
## 🙏 銘謝貢獻
|
||||
|
||||
| 貢獻者 | 貢獻內容 |
|
||||
|--------|----------|
|
||||
| [kmou424](https://github.com/kmou424)(臭批老k) | 提供部分驗證函數思路 |
|
||||
| [雄氏老方](http://www.coolapk.com/u/665894)(屑老方) | 提供自動更新腳本方案 |
|
||||
| [sakuradairong](https://github.com/sakuradairong)(雨季騷年/胖子老陳) | 新增 WebDAV / SMB 功能與測試 |
|
||||
| [XayahSuSuSu](https://github.com/XayahSuSuSu) | 提供 App 支持與 dex 功能支持 |
|
||||
|
||||
`文檔編輯:Petit-Abba, YuKongA`
|
||||
|
||||
---
|
||||
|
||||
<p align="center">
|
||||
<sub>GPL-3.0 Licensed · Made with ❤️ by <a href="https://github.com/YAWAsau">YAWAsau</a></sub>
|
||||
</p>
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
Lo=0
|
||||
|
||||
#後台執行腳本
|
||||
0不能關閉當前終端,有壓縮速率
|
||||
1終端有可能完全無顯示,但是log會持續刷新,可直接完全關閉終端
|
||||
#0不能關閉當前終端,有壓縮速率
|
||||
#1終端有可能完全無顯示,但是log會持續刷新,可直接完全關閉終端
|
||||
background_execution=0
|
||||
|
||||
#腳本語言設置 留空則自動識別系統語言環境並翻譯
|
||||
#1簡體中文 0繁體中文
|
||||
Shell_LANG=0
|
||||
Shell_LANG=
|
||||
|
||||
#備份開始後偽裝亮屏
|
||||
#1開啟 0關閉
|
||||
@@ -19,6 +19,12 @@ setDisplayPowerMode=0
|
||||
#自定義備份文件輸出位置 支持相對路徑(留空則默認當前路徑)
|
||||
Output_path=""
|
||||
|
||||
#自定義備份目錄後綴(留空則不添加後綴)
|
||||
#支持日期時間變量:%yyyymmdd %hhmmss %yyyymmddhhmmss %yyyy %mm %dd
|
||||
#例:_daily → Backup_zstd_0_daily
|
||||
#例:_%yyyymmdd → Backup_zstd_0_20260522
|
||||
Backup_suffix=""
|
||||
|
||||
#自定義applist.txt位置 支持相對路徑(留空則默認當前路徑)
|
||||
list_location=""
|
||||
|
||||
@@ -37,7 +43,7 @@ cdn=1
|
||||
mount_point="rannki|0000-1"
|
||||
|
||||
#使用者(如0 999等用戶,如存在多個用戶留空強制選擇,無多個用戶則默認用戶0不詢問)
|
||||
user=
|
||||
user=0
|
||||
|
||||
#備份模式
|
||||
#1包含數據+安裝包,0僅包安裝包
|
||||
@@ -59,23 +65,19 @@ backup_media=0
|
||||
Background_apps_ignore=0
|
||||
|
||||
#添加自定義備份路徑 例:Download DCIM等文件夾 請使用絕對路徑,請勿刪除""
|
||||
Custom_path="
|
||||
/storage/emulated/0/Pictures/
|
||||
/storage/emulated/0/Download/
|
||||
/storage/emulated/0/Music
|
||||
/storage/emulated/0/DCIM/
|
||||
#/data/adb
|
||||
"
|
||||
Custom_path=""
|
||||
|
||||
#黑名單模式(1完全忽略,不備份 0僅備份安裝包,注意!此選項Backup_Mode=1時黑名單模式才能使用)
|
||||
blacklist_mode=0
|
||||
|
||||
#備份黑名單(備份策略由「黑名單模式」控制,此處只作為黑名單應用列表)
|
||||
blacklist="
|
||||
com.esunbank
|
||||
com.facebook.orca
|
||||
com.facebook.katana
|
||||
com.instagram.barcelona
|
||||
com.instagram.android
|
||||
com.facebook.katana
|
||||
com.esunbank.ESUNWALLET
|
||||
com.esunbank
|
||||
#com.chailease.tw.app.android.ccfappcust"
|
||||
|
||||
#位於data的預裝應用白名單 例:相冊 錄音機 天氣 計算器等(默認屏蔽備份預裝應用,如需備份請添加預裝應用白名單)
|
||||
@@ -116,9 +118,56 @@ com.android.chrome"
|
||||
#zstd擁有良好的壓縮率與速度
|
||||
Compression_method=zstd
|
||||
|
||||
#主色
|
||||
rgb_a=226
|
||||
#輔色
|
||||
rgb_b=123
|
||||
rgb_c=177
|
||||
#色彩設定 (256 色 ANSI 編號)
|
||||
#常用值: 39藍 51青 82綠 196紅 208橘 213粉 220黃 165紫
|
||||
#主色 (一般資訊, 預設亮黃)
|
||||
rgb_a=220
|
||||
#輔色1 (提示/進度, 預設亮青)
|
||||
rgb_b=51
|
||||
#輔色2 (強調/變數值, 預設粉紅)
|
||||
rgb_c=213
|
||||
|
||||
#遠程備份類型 (留空不啟用)
|
||||
#推薦 webdav (穩定)
|
||||
#smb 支援 SMB2/SMB3 (本腳本拒絕 SMB1/CIFS, 會自動協商到伺服器支援的最高版本)
|
||||
remote_type=
|
||||
# 保存原始值, 供連線失敗後 (如中途開 WiFi) 重新檢測用
|
||||
_remote_type_orig=
|
||||
|
||||
#遠程地址 (兩種協議分開設定, 切換 remote_type 免重輸)
|
||||
#SMB例: smb://192.168.1.100/backup/
|
||||
smb_url=
|
||||
#認證用戶名
|
||||
smb_remote_user=
|
||||
#認證密碼
|
||||
smb_remote_pass=""
|
||||
#WebDAV例: http://192.168.1.100:8080/dav/
|
||||
webdav_url=
|
||||
#認證用戶名
|
||||
webdav_remote_user=
|
||||
#認證密碼
|
||||
webdav_remote_pass=""
|
||||
|
||||
#流式上傳 (邊壓邊傳, 不佔本機空間)
|
||||
#1 開啟流式: 數據直接壓縮→管道傳到遠端, 本機不留 tar (省空間, 全量上傳, 不做本機校驗/增量)
|
||||
#0 關閉(預設): 先壓到本機→校驗→再上傳 (保留本機檔案, 支援增量)
|
||||
#支援 smb / webdav 兩種 remote_type
|
||||
remote_stream=0
|
||||
|
||||
#流式上傳除錯 (1=失敗時印出 smbclient/curl 的具體錯誤, 用於排查流式失敗原因)
|
||||
_stream_debug=1
|
||||
|
||||
#遠程備份完成後是否保留本地檔案
|
||||
#1保留本地檔案(上傳後不刪除) 0上傳成功後刪除本地檔案
|
||||
remote_keep_local=0
|
||||
|
||||
#邊備份邊上傳 (每備份完一個應用立即上傳,然後刪除本機檔案再備份下一個,以節省本機空間)
|
||||
#1 開啟 0 關閉
|
||||
#開啟後:每個應用備份完成 → 立即上傳遠端 → 上傳成功後刪除本機檔案 → 繼續備份下一個
|
||||
#關閉後:先備份所有應用 → 全部備份完再統一上傳
|
||||
remote_upload_per_app=0
|
||||
|
||||
#log 目錄大小上限 (單位 MB), 達到上限會在啟動時自動清空 log/
|
||||
#留空或設 0 = 關閉自動清理
|
||||
log_max_size_mb=1
|
||||
|
||||
|
||||
246
docs/superpowers/plans/2026-05-09-remote-backup.md
Normal file
246
docs/superpowers/plans/2026-05-09-remote-backup.md
Normal file
@@ -0,0 +1,246 @@
|
||||
# Remote Backup (WebDAV & SMB) Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Add WebDAV upload and SMB mount backup support to the backup script using built-in busybox tools.
|
||||
|
||||
**Architecture:** Four config variables in `backup_settings.conf` control remote backup. Five new functions in `tools/tools.sh` handle SMB mount/unmount and WebDAV upload. A single hook in `backup_path()` triggers remote setup. The existing EXIT trap is extended to handle remote cleanup.
|
||||
|
||||
**Tech Stack:** Shell script (Android mksh compatible), busybox (wget, mount, umount)
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
| File | Action | Responsibility |
|
||||
|------|--------|---------------|
|
||||
| `backup_settings.conf` | Append | Remote backup configuration |
|
||||
| `tools/tools.sh` | Modify | Remote backup functions + hook + trap extension |
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Add remote config to backup_settings.conf
|
||||
|
||||
**Files:**
|
||||
- Modify: `backup_settings.conf`
|
||||
|
||||
- [ ] **Step 1: Append remote backup configuration**
|
||||
|
||||
Append after line 123 (`rgb_c=177`), before the trailing newline at line 124:
|
||||
|
||||
```conf
|
||||
|
||||
#遠程備份類型 (留空不啟用)
|
||||
#webdav 或 smb
|
||||
remote_type=
|
||||
|
||||
#遠程地址
|
||||
#WebDAV例: http://192.168.1.100:8080/dav/
|
||||
#SMB例: //192.168.1.100/backup
|
||||
remote_url=
|
||||
|
||||
#遠程認證用戶名
|
||||
remote_user=
|
||||
|
||||
#遠程認證密碼
|
||||
remote_pass=
|
||||
```
|
||||
|
||||
Edit command: Use the Edit tool to append these lines after `rgb_c=177`.
|
||||
|
||||
- [ ] **Step 2: Verify config file**
|
||||
|
||||
Run: Read `backup_settings.conf` lines 120-140 to confirm the config lines are present.
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add backup_settings.conf
|
||||
git commit -m "feat: add remote backup config (remote_type, remote_url, remote_user, remote_pass)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 2: Add remote backup functions to tools.sh
|
||||
|
||||
**Files:**
|
||||
- Modify: `tools/tools.sh` (insert after line 465, before `Show_boottime` at line 466)
|
||||
|
||||
- [ ] **Step 1: Insert remote functions**
|
||||
|
||||
Insert after line 465 (`kill_Serve` call) and before line 466 (`Show_boottime()`):
|
||||
|
||||
```sh
|
||||
# -------- 遠程備份功能 --------
|
||||
mount_smb() {
|
||||
local mnt="$TMPDIR/smb_mount"
|
||||
mkdir -p "$mnt"
|
||||
if busybox mount -t cifs "$remote_url" "$mnt" -o "username=$remote_user,password=$remote_pass,iocharset=utf8,vers=2.0" 2>/dev/null; then
|
||||
SMB_MOUNT="$mnt"
|
||||
[[ $(mount | grep "$mnt") != "" ]] || { echoRgb "SMB掛載失敗: $remote_url" "0"; return 1; }
|
||||
echoRgb "SMB已掛載: $remote_url -> $mnt" "1"
|
||||
return 0
|
||||
fi
|
||||
echoRgb "SMB掛載失敗,回退本地備份" "0"
|
||||
return 1
|
||||
}
|
||||
|
||||
umount_smb() {
|
||||
[[ -n $SMB_MOUNT ]] && {
|
||||
busybox umount -l "$SMB_MOUNT" 2>/dev/null
|
||||
rm -rf "$SMB_MOUNT"
|
||||
unset SMB_MOUNT
|
||||
echoRgb "SMB已卸載" "2"
|
||||
}
|
||||
}
|
||||
|
||||
upload_webdav() {
|
||||
local base_url="${remote_url%/}"
|
||||
local auth=$(echo -n "$remote_user:$remote_pass" | busybox base64)
|
||||
local failed=0
|
||||
local list_file="$TMPDIR/.wdav_list"
|
||||
find "$Backup" -type f > "$list_file"
|
||||
while read -r f; do
|
||||
[[ -z $f ]] && continue
|
||||
local rel="${f#$Backup/}"
|
||||
echoRgb "上傳: $rel" "2"
|
||||
if busybox wget -q --method PUT --body-file="$f" --header "Authorization: Basic $auth" "$base_url/$rel" 2>/dev/null; then
|
||||
rm -f "$f"
|
||||
else
|
||||
failed=1
|
||||
break
|
||||
fi
|
||||
done < "$list_file"
|
||||
rm -f "$list_file"
|
||||
if [[ $failed -eq 0 ]]; then
|
||||
echoRgb "WebDAV上傳完成" "1"
|
||||
else
|
||||
echoRgb "WebDAV上傳失敗,本地檔案已保留" "0"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
remote_setup() {
|
||||
[[ -z $remote_type ]] && return
|
||||
|
||||
case $remote_type in
|
||||
smb)
|
||||
mount_smb || return
|
||||
Backup="$SMB_MOUNT/Backup_${Compression_method}_$user"
|
||||
mkdir -p "$Backup"
|
||||
Backup_path="${Backup%/*}"
|
||||
Output_path=""
|
||||
echoRgb "遠程備份目錄: $Backup" "3"
|
||||
;;
|
||||
webdav)
|
||||
echoRgb "WebDAV模式: 備份完成後將自動上傳" "3"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
remote_cleanup() {
|
||||
case $remote_type in
|
||||
smb) umount_smb ;;
|
||||
webdav) upload_webdav ;;
|
||||
esac
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Verify insertion**
|
||||
|
||||
Run: Read `tools/tools.sh` lines 464-550 to confirm functions are inserted correctly and `Show_boottime()` follows.
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add tools/tools.sh
|
||||
git commit -m "feat: add remote backup functions (mount_smb, umount_smb, upload_webdav, remote_setup, remote_cleanup)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 3: Wire hook and trap
|
||||
|
||||
**Files:**
|
||||
- Modify: `tools/tools.sh` (line 462 and line 991-993)
|
||||
|
||||
- [ ] **Step 1: Modify EXIT trap in kill_Serve**
|
||||
|
||||
Change line 462 from:
|
||||
```sh
|
||||
trap "rm -rf '$LOCK_DIR'" EXIT
|
||||
```
|
||||
to:
|
||||
```sh
|
||||
trap "rm -rf '$LOCK_DIR'; remote_cleanup" EXIT
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Add remote_setup call at end of backup_path()**
|
||||
|
||||
Change line 991-993 from:
|
||||
```sh
|
||||
echoRgb "$hx備份資料夾所使用分區統計如下↓\n -$(df -h "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-3),$(NF-2),$(NF-1),$(NF)}' | awk 'END{print "總共:"$1"已用:"$2"剩餘:"$3"使用率:"$4}')檔案系統:$(df -T "$Backup_path" | sed -n 's|% /.*|%|p' | awk '{print $(NF-4)}')\n -備份目錄輸出位置↓\n -$Backup"
|
||||
echoRgb "$outshow" "2"
|
||||
}
|
||||
```
|
||||
to:
|
||||
```sh
|
||||
echoRgb "$hx備份資料夾所使用分區統計如下↓\n -$(df -h "${Backup%/*}" | sed -n 's|% /.*|%|p' | awk '{print $(NF-3),$(NF-2),$(NF-1),$(NF)}' | awk 'END{print "總共:"$1"已用:"$2"剩餘:"$3"使用率:"$4}')檔案系統:$(df -T "$Backup_path" | sed -n 's|% /.*|%|p' | awk '{print $(NF-4)}')\n -備份目錄輸出位置↓\n -$Backup"
|
||||
echoRgb "$outshow" "2"
|
||||
remote_setup
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Verify EXIT trap**
|
||||
|
||||
Run: Read `tools/tools.sh` line 462 to confirm the trap includes `remote_cleanup`.
|
||||
|
||||
- [ ] **Step 4: Verify hook**
|
||||
|
||||
Run: Read `tools/tools.sh` lines 989-994 to confirm `remote_setup` is inside `backup_path()` before the closing `}`.
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add tools/tools.sh
|
||||
git commit -m "feat: wire remote backup hook and EXIT trap"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 4: Verify changes
|
||||
|
||||
**Files:**
|
||||
- Check: `tools/tools.sh`, `backup_settings.conf`
|
||||
|
||||
- [ ] **Step 1: Verify git diff**
|
||||
|
||||
```bash
|
||||
git diff master
|
||||
```
|
||||
|
||||
Expected: ~80 lines added across 2 files:
|
||||
- `backup_settings.conf`: +9 lines (remote config)
|
||||
- `tools/tools.sh`: +~70 lines (functions, trap modification, hook), 1 line modified (trap), 1 line added (hook call)
|
||||
|
||||
- [ ] **Step 2: Verify no syntax errors in shell script**
|
||||
|
||||
```bash
|
||||
bash -n tools/tools.sh
|
||||
```
|
||||
|
||||
Ignore "not found" warnings for Android-specific tools — we're only checking syntax.
|
||||
|
||||
- [ ] **Step 3: Verify function names don't collide**
|
||||
|
||||
```bash
|
||||
Select-String -Pattern "^(mount_smb|umount_smb|upload_webdav|remote_setup|remote_cleanup)\b" -Path tools/tools.sh
|
||||
```
|
||||
|
||||
Expected: Each function name appears once (definition only, not duplicated).
|
||||
|
||||
- [ ] **Step 4: Commit any fixes if needed**
|
||||
|
||||
```bash
|
||||
git add -A && git commit -m "fix: address verification issues"
|
||||
```
|
||||
136
docs/superpowers/specs/2026-05-09-remote-backup-design.md
Normal file
136
docs/superpowers/specs/2026-05-09-remote-backup-design.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# Remote Backup (WebDAV & SMB) 设计文档
|
||||
|
||||
**日期:** 2026-05-09
|
||||
**目标:** 在不涉及大范围改动的前提下,为脚本增加备份到远程 WebDAV 和 SMB 的功能。
|
||||
|
||||
---
|
||||
|
||||
## 需求
|
||||
|
||||
- 支持直接备份到远程 WebDAV 和 SMB 设备
|
||||
- 使用脚本内置 busybox,不依赖额外工具
|
||||
- 配置通过 `backup_settings.conf`
|
||||
- 最小化对现有代码的改动
|
||||
|
||||
---
|
||||
|
||||
## 架构
|
||||
|
||||
### 配置
|
||||
|
||||
在 `backup_settings.conf` 末尾追加 4 个配置项:
|
||||
|
||||
```conf
|
||||
#远程备份类型 (留空不启用)
|
||||
#webdav 或 smb
|
||||
remote_type=
|
||||
|
||||
#远程地址
|
||||
#WebDAV例: http://192.168.1.100:8080/dav/
|
||||
#SMB例: //192.168.1.100/backup
|
||||
remote_url=
|
||||
|
||||
#远程认证用户名
|
||||
remote_user=
|
||||
|
||||
#远程认证密码
|
||||
remote_pass=
|
||||
```
|
||||
|
||||
### 新增函数(tools/tools.sh)
|
||||
|
||||
所有函数定义在 `tools/tools.sh` 中,靠近 `kill_Serve()` 之后的位置(~line 465)。
|
||||
|
||||
| 函数 | 行数 | 说明 |
|
||||
|------|------|------|
|
||||
| `mount_smb()` | ~10 | busybox `mount -t cifs` 挂载 SMB 到 `$TMPDIR/smb_mount` |
|
||||
| `umount_smb()` | ~5 | 安全卸载 SMB 挂载点 |
|
||||
| `upload_webdav()` | ~20 | 遍历备份目录,用 busybox `wget --method PUT` 逐个上传 |
|
||||
| `remote_setup()` | ~25 | 入口函数:SMB 挂载后设置 Output_path;WebDAV 注册 trap |
|
||||
| `remote_cleanup()` | ~15 | SMB 卸载 / WebDAV 上传+清理本地文件 |
|
||||
|
||||
### Hook 点
|
||||
|
||||
在 `backup_path()` 调用之后(line 991 附近)插入一行:
|
||||
|
||||
```sh
|
||||
remote_setup
|
||||
```
|
||||
|
||||
### 流程
|
||||
|
||||
```
|
||||
backup_path() # 确定本地备份路径 $Backup
|
||||
↓
|
||||
remote_setup() # 如启用远程,挂载 SMB 或准备 WebDAV uploader
|
||||
↓
|
||||
[SMB] [WebDAV]
|
||||
mount_smb() 正常本地备份
|
||||
$Backup → mount ↓
|
||||
正常备份 upload_webdav() (at EXIT)
|
||||
↓ rm -rf 本地副本
|
||||
umount_smb()
|
||||
```
|
||||
|
||||
### SMB 实现细节
|
||||
|
||||
```sh
|
||||
mount_smb() {
|
||||
local mnt="$TMPDIR/smb_mount"
|
||||
mkdir -p "$mnt"
|
||||
busybox mount -t cifs "$remote_url" "$mnt" -o "username=$remote_user,password=$remote_pass,iocharset=utf8"
|
||||
# 若 busybox mount 不支持 cifs,尝试系统 mount
|
||||
# 失败则返回非0,remote_setup 回退到本地备份
|
||||
}
|
||||
```
|
||||
|
||||
挂载成功后,`remote_setup()` 将 `$Backup` 覆盖为 `$mnt/Backup_${Compression_method}_$user`,后续备份流程无需修改。
|
||||
|
||||
### WebDAV 实现细节
|
||||
|
||||
```sh
|
||||
upload_webdav() {
|
||||
local base_url="${remote_url%/}"
|
||||
# 创建远程目录 (MKCOL)
|
||||
busybox wget -q --method MKCOL --header "Authorization: ..." "$base_url/..." 2>/dev/null
|
||||
# 遍历上传
|
||||
find "$Backup" -type f | while read f; do
|
||||
busybox wget -q --method PUT --body-file="$f" --header "Authorization: ..." "$base_url/..."
|
||||
# 上传成功才删除本地文件
|
||||
done
|
||||
}
|
||||
```
|
||||
|
||||
备份先写到本地(正常流程),EXIT 时 `remote_cleanup()` 触发上传,成功后删除本地副本。
|
||||
|
||||
### 错误处理
|
||||
|
||||
- SMB 挂载失败:回退到本地备份(echo 警告,继续执行)
|
||||
- WebDAV 上传失败:保留本地文件不删除(保留数据,用户手动排查)
|
||||
- SMB 连接断开:trap EXIT 确保 `umount_smb()` 被调用
|
||||
- 网络异常:wget 自带超时,不会永久阻塞
|
||||
|
||||
### 恢复支持(后续迭代)
|
||||
|
||||
本次仅实现备份到远程。恢复从远程可在后续 PR 中补充,方向是对称实现:
|
||||
- SMB:挂载后从挂载点恢复
|
||||
- WebDAV:wget 下载到临时目录后恢复
|
||||
|
||||
---
|
||||
|
||||
## 改动范围
|
||||
|
||||
| 文件 | 改动 |
|
||||
|------|------|
|
||||
| `backup_settings.conf` | +9 行配置 |
|
||||
| `tools/tools.sh` | +75 行(5 个函数 + 1 个 hook 调用) |
|
||||
|
||||
---
|
||||
|
||||
## 测试要点
|
||||
|
||||
1. SMB 挂载成功 → 备份文件出现在远程共享目录
|
||||
2. SMB 挂载失败 → 回退到本地备份,有警告提示
|
||||
3. WebDAV 上传成功 → 远程有备份文件,本地副本已清理
|
||||
4. WebDAV 上传失败 → 本地文件保留,有错误提示
|
||||
5. EXIT 时 SMB 挂载点被正确卸载(无残留)
|
||||
5
start.sh
5
start.sh
@@ -6,4 +6,7 @@ if [ -f "${0%/*}/tools/tools.sh" ]; then
|
||||
else
|
||||
echo "${0%/*}/tools/tools.sh遺失"
|
||||
fi
|
||||
. "${0%/*}/tools/tools.sh" | tee "${0%/*}/log.txt"
|
||||
mkdir -p "${0%/*}/log" 2>/dev/null
|
||||
logfile="${0%/*}/log/log_$(date +%Y-%m-%d_%H-%M).txt"
|
||||
. "${0%/*}/tools/tools.sh" | tee "$logfile"
|
||||
sed -i "$(printf 's/\[[0-9;]*m//g')" "$logfile"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
BIN
tools/curl
Normal file
BIN
tools/curl
Normal file
Binary file not shown.
BIN
tools/smbclient
Normal file
BIN
tools/smbclient
Normal file
Binary file not shown.
1049
tools/soc.json
1049
tools/soc.json
File diff suppressed because one or more lines are too long
8062
tools/tools.sh
8062
tools/tools.sh
File diff suppressed because it is too large
Load Diff
BIN
tools/zstd
BIN
tools/zstd
Binary file not shown.
Reference in New Issue
Block a user