kivensteven8-eng/dsh-file-download ↗★ 0
dsh-file-download
DSH 插件:把会话工作区文件变成浏览器直接下载的 HTTP 通道,为 iPad 等局域网设备设计。
AI Analysis
核心用途是解决无桌面服务器或移动端设备(如 iPad)无法通过本地特权方法打开工作区文件的问题。适合在局域网或移动端浏览器中访问 DSH 并需要下载生成文件的用户。
Install
This plugin has no verified bundle, or compatibility checks failed. Read the repository notes first. Read the full README ↗
README
Read the full README ↗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:/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