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_PORT | 8766 | 监听端口 |
DSH_DL_HOST | 0.0.0.0 | 绑定地址 |
DSH_DL_ROOT | cwd | 允许下载的工作区根 |
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 自身的围栏一致(针对无鉴权面的轻量防护,不是认证系统):
- 只读 —— 仅 GET/HEAD;
- 严格限定工作区 —— realpath 包含校验,穿越(
../)、绝对路径、符号 链接外逃全拒;任意层级的隐藏条目(.开头)一律 403; - DNS 重绑定围栏 —— Host 必须是回环、本机网卡 IP 字面量、主机名或白名单
授权域;跨站标记(
Sec-Fetch-Site: cross-site/ 异源Origin)拒绝; - 体积上限(默认 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