Back to home@kivensteven8-eng

dsh-file-download

DSH 插件:把会话工作区文件变成浏览器直接下载的 HTTP 通道 —— 为 iPad 等局域网/域名设备设计。

Stars
0
Language
JavaScript
Created
Aug 27, 2026
Updated
Aug 27, 2026

Introduction

dsh-file-download

面向 DeepSeek Harness(DSH)的文件下载插件:把会话工作区里的文件变成浏览器 直接下载的 HTTP 通道 —— 为 iPad Safari / iPhone 等局域网与域名访问设备设计, 让"生成文件保存到本地"不再依赖服务器桌面环境。

背景:DSH 的 host.openPath 属于特权方法,永远只允许回环(loopback)调用; 无桌面 Linux 服务器上即使放开也没有应用能"打开"文件。正确姿势就是 HTTP 下载。

两种用法:独立零依赖服务(不装插件也能用)与 cordis 插件(随 profile 启动)。参考实现见 dsh-pentest 的仓库 形态。

安装

方式一 · DSH 插件(推荐)

# 从 GitHub 直接安装(仓库根目录即可被 pnpm 解析)
dsh plugin --profile web add github:<your-name>/dsh-file-download

# 或本地路径安装
dsh plugin --profile web add ./path/to/repo

安装后重启 profile 生效:

  • 列表页 http(s)://<你的入口>/…/dsh-file-download/
  • 下载  同前缀 + /file?path=<工作区相对路径>
  • 前缀可用 cordis.patch.yml 里 config.mountPath 调整

卸载:dsh plugin --profile web remove dsh-file-download

⚠️ 插件随 profile 重启加载 —— 会中断当前会话,建议空余时操作。

方式二 · 独立服务(不动 DSH)

node service.mjs     # 默认 0.0.0.0:8766,根目录取 DSH_DL_ROOT 或 cwd

环境变量:

变量默认说明
DSH_DL_PORT8766监听端口
DSH_DL_HOST0.0.0.0绑定地址
DSH_DL_ROOTcwd允许下载的工作区根
DSH_DL_MOUNT反代保留前缀时填写,如 /dl
DSH_DL_TOKEN设置后所有请求必须带 ?token=
DSH_DL_EXTRA_HOSTS额外放行的 Host 授权,逗号分隔

反代场景(Caddy 示例)

# 在 forward_auth 之前挂载,由服务的 ?token= 自行保护
handle /dl* {
	reverse_proxy 127.0.0.1:8766
}

配套的 watch-caddy.mjs 是一个自愈看门狗:若外部进程会周期性 从磁盘重载 Caddy、把运行时添加的路由冲掉,它可以每 15 秒巡检并自动补回。

安全模型

设计哲学与 DSH 自身的围栏一致(针对无鉴权面的轻量防护,不是认证系统):

  1. 只读 —— 仅 GET/HEAD;
  2. 严格限定工作区 —— realpath 包含校验,穿越(../)、绝对路径、符号 链接外逃全拒;任意层级的隐藏条目(. 开头)一律 403;
  3. DNS 重绑定围栏 —— Host 必须是回环、本机网卡 IP 字面量、主机名或白名单 授权域;跨站标记(Sec-Fetch-Site: cross-site / 异源 Origin)拒绝;
  4. 体积上限(默认 500 MB)+ Content-Disposition: attachment + nosniff + no-store,杜绝被当页面渲染。

中文文件名按 RFC 5987 filename* 编码,iPad 上还原正常。 公网暴露请务必置于带认证的反向代理之后。

发布

推送 v* 标签即触发 GitHub Actions:npm pack 打包并在 Release 附上 dsh-file-download.tar.gz

MIT © 2026