前言¶
在 Android 上給 DeepSeek Harness(DSH)接命令行工具時,常見路徑是 Termux 或需要 root / Shizuku 的 shell。Android 10 起,應用私有目錄中的文件不能直接 execve,許多「把二進制拷進工作目錄再執行」的做法會碰到 Permission denied。Termux 官方倉庫提供的是 aarch64、bionic 構建的包,可通過 /system/bin/linker64 加載。維護者 Verchiel666 的 dsh-termux 把「查包 → 下載 → 純 JS 解 xz/tar → 裝進 prefix → 用 linker64 起進程」接到 DSH 工具鏈裏,無需 root,也無需 Shizuku。下面介紹它的定位、工具、配置與邊界。
這是什麼¶
dsh-termux 是 DSH 客戶端類插件:從 packages.termux.dev 拉取 Termux 倉庫的 aarch64 包,在 JS 側完成 xz/tar 解壓與依賴安裝,並用系統 linker64 運行已裝入 prefix 的可執行文件。npm 包名爲 dsh-termux,當前版本 0.2.1,要求宿主 DSH >= 0.2.0,許可證 MIT。社區目錄頁:SkillHub - dsh-termux;源碼與說明:GitHub - Verchiel666/dsh-termux。
爲什麼需要它¶
README 中的機制簡述如下:SELinux 限制的是對私有目錄文件的 execve,不阻止通過 mmap(PROT_EXEC) 並讓 linker64 加載 ELF。Termux 包在鏈接時 PT_INTERP 指向 /system/bin/linker64,因此顯式用 linker64 啓動可以繞開「不能在 app 私有目錄 exec」的限制。插件把這一流程固化爲四個 DSH 工具,寫類操作走 tools/pre-execute 審批(將 allow 升爲 ask,deny 仍優先)。
核心功能¶
四個工具¶
| 工具 | 風險 | 作用 |
|---|---|---|
termux_search |
read | 按名稱或描述在倉庫中搜索包 |
termux_list |
read | 列出已裝包、可執行文件與庫 |
termux_install |
write | 安裝包(含依賴、SHA256 校驗、解 xz/tar) |
termux_run |
write | 用 linker64 運行 prefix 內已安裝工具(不接受任意路徑) |
能力與網絡¶
package.json 聲明的能力包括:tools:register、network:egress、subprocess、fs:write。網絡僅訪問 packages.termux.dev(索引與包體);索引緩存 24 小時,.deb 緩存在 prefix/.cache/debs。
環境變量(0.1.2 起由 termux_run 按 prefix 實際文件補全)¶
Termux 編譯期把 PREFIX 寫死爲 /data/data/com.termux/files/usr,裝到別處後需運行時覆蓋。termux_run 會設置例如 LD_LIBRARY_PATH、PREFIX/PATH、MAGIC(供 file)、TLS 相關變量、TERMINFO/TZDIR 等;臨時覆蓋可傳 env 參數,示例見 README:termux_run {tool:"file", args:["x"], env:{"MAGIC":"/path/magic"}}。
安裝與啓用¶
在 DSH 插件管理界面安裝 dsh-termux,然後重啓引擎。裝好後會話中會出現 termux_search、termux_install、termux_list、termux_run。
若通過 npm 單獨引用包體,README 給出:
npm i dsh-termux
(DSH 宿主內安裝仍以插件管理爲準,不要自行拼接未在文檔中出現的 dsh plugin add 命令。)
配置¶
插件通過 cordis.patch.yml 注入 Cordis 配置,可改安裝前綴:
# cordis.patch.yml
- insert:
- id: termux
name: dsh-termux
config:
prefixDir: '' # 留空 = $HOME/work/tbins/prefix
prefixDir 留空時使用默認路徑 $HOME/work/tbins/prefix。
典型用法¶
- 用
termux_search確認包名。 - 用
termux_install安裝目標包及依賴。 - 用
termux_list查看已裝內容與可執行名。 - 用
termux_run執行,例如 README 實測:
termux_run {"tool":"jq","args":["--version"]}
(在 Android 17 / aarch64 環境下 README 記載安裝 jq 後上述調用返回 jq-1.8.2。)
適用場景與注意¶
適合誰:在 DSH 會話裏需要 單進程 CLI(如 jq、tree、fd)且不想依賴 root/Shizuku 的開發者;架構需爲 aarch64,包來源爲 Termux 官方倉庫。
明確邊界(來自 README):
- 需要 fork 子進程 的工具(如 git、包管理器、依賴
popen的)仍受execve限制,應改用 Shizuku 的adb_shell或等待系統策略變化;GIT_EXEC_PATH雖可設,子進程問題依舊。 - 包內 shebang 指向 Termux 專用路徑 的腳本無法直接跑。
- 動態庫依賴
LD_LIBRARY_PATH指向 prefix 下的usr/lib,不要指望 Termux 內置 rpath。 - 安裝的是第三方預編譯二進制,雖有 SHA256 校驗,仍應知曉包名與用途。
插件以當前 DSH 進程權限運行;安裝前建議閱讀 倉庫源碼 與 MIT 許可證。DSH 插件生態由社區目錄(如 SkillHub)收錄,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-termux 把 Termux aarch64 倉庫、純 JS 解壓與 linker64 執行串成一套 DSH 工具,在不 root 的前提下擴展 Android 上的命令行能力。更多說明與 Issues 見 GitHub,目錄條目見 SkillHub。