dsh-termux:在 DSH 裏安裝並運行 Termux aarch64 命令行工具

前言

在 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。

典型用法

  1. 用 termux_search 確認包名。
  2. 用 termux_install 安裝目標包及依賴。
  3. 用 termux_list 查看已裝內容與可執行名。
  4. 用 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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜