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。

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

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

Xiaoye