跳到正文
dsh-market 浏览插件 GitHub EN

wzn16/dsh-fs-allowlist

白名单目录写入免审批——write/edit 文件工具直通白名单栅栏,命中白名单的 bash 沙箱升权自动放行,设置页可视化管理目录与开关。

Star 数 ★ 0 分类 安全与权限 收录于 2026-09-18

安装

在 DeepSeek Harness 里通过 dsh-market 安装

dsh plugin --profile web add dshmarket

或使用命令行

dsh plugin --profile web add github:wzn16/dsh-fs-allowlist

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络。请先审阅源码,并尽量锁定 commit(github:owner/repo#sha)。

README

English | 中文

DSH 插件:白名单目录写入免审批。让 write/edit 文件工具对配置的白名单目录(如 Obsidian 知识库)直接写入,不再触发「沙箱拒绝 → 升权重试 → 人工审批」;并提供 设置 → 插件 → 目录白名单 图形界面与 bash 升权自动放行。其余路径行为与现状完全一致。

功能总览

层 机制 覆盖
write/edit 工具 包装 ctx.fs.checkedTarget 栅栏,白名单路径提前放行 知识库读写全免审批
bash 命令 tools/pre-execute 记录命令原文 + approval/request 代答:命令原文或升权理由命中白名单路径(递归判定)时自动 allowed-once bash 写白名单目录免审批(命令文本优先,未命中转人工)
设置页 GUI settings.plugins.tab 注册「目录白名单」页签 + 服务端 HTTP 管理路由 可视化增删目录、开关 bash 代答

配置支持热更新:GUI 修改即时生效;手动编辑配置文件 3 秒内自动生效,均无需重启 DSH。

原理

write/edit 层

DSH 的 write/edit 工具写入前都经过 dsh-fs-sandbox 挂载的 ctx.fs.checkedTarget() 栅栏(工作区外 → 抛 FS_SANDBOX_DENIED → 模型升权重试 → 审批弹窗)。本插件包装该栅栏方法:

  • 目标路径 canonical 解析后落在白名单内 → 提前放行(返回与栅栏一致的解析结果);
  • 未命中 / read-only 模式 / 解析失败 → 原样委托原栅栏,行为分毫不变。

原子写、版本守卫、先读后写检查、diff 事件等文件语义全部位于栅栏之下的 dsh-fs-local,本插件不触碰。白名单判定与栅栏使用相同的 realpath(最深已存在祖先)语义,symlink 换向逃逸不成立。

bash 层(审批代答)

bash 走 Seatbelt 进程沙箱,白名单无法从插件层注入 profile;取而代之的是双监听器协作:tools/pre-execute 先把每次 bash 调用的命令原文按 callId 记入索引表,approval/request 代答时按 callId 查回命令原文,与升权理由一起做白名单匹配——从文本中提取路径 token,~ 展开 home 后与白名单根做递归包含判定(填父目录即覆盖全部子目录)。命令原文几乎必含目标路径,不再依赖模型在升权理由里写不写路径。未命中一律转人工(失败安全)。可在设置页随时关闭。

安装

dsh plugin --profile web add /path/to/dsh-fs-allowlist

发布到 GitHub 后也可以直接:

dsh plugin --profile web add "github:wzn16/dsh-fs-allowlist#main"

装入 $DSH_HOME/profiles/web 并自动登记,重启 DSH Desktop 后生效(刷浏览器不够)。本插件源码目录被 profile 以 link: 方式引用,改源码后重启即生效,无需重装。

配置

$DSH_HOME/fs-allowlist.json(主目录解析与官方一致:$DSH_HOME 优先,桌面版按平台取 userData——macOS ~/Library/Application Support/dsh-desktop/harness、Windows %APPDATA%\dsh-desktop\harness、Linux $XDG_CONFIG_HOME/dsh-desktop/harness——再回退开源版 ~/.dsh):

{
  "extraWritableRoots": [
    "/Users/wangzhaonan/zhaonan/ObsidianVault"
  ],
  "bashAutoApprove": true
}
  • 推荐通过 设置 → 插件 → 目录白名单 调整,免手编;
  • 文件缺失 / JSON 非法 / 空列表 → 白名单为空,插件等效透明(= 未安装的行为),即一键回退;
  • bashAutoApprove 缺省视为 true。

行为矩阵

场景 行为
write/edit 写入工作区内 免审批(原生行为,不变)
write/edit 写入白名单目录 免审批直写
write/edit 写入其他路径 拒绝 → 升权 → 审批(不变)
read-only 模式写白名单 仍拒绝(尊重更严旋钮)
bash 写白名单目录(命令或理由命中) 自动放行,不弹审批
bash 其他升权(均未命中) 正常弹审批

已知边界

  1. bash 代答按「命令原文 + 升权理由」匹配白名单(递归路径判定 + 子串兜底),仍属启发式:极端情况下命令与理由都未出现白名单路径会多弹一次审批(失败安全);命中即放行该次调用。
  2. checkedTarget 属于 DSH 随包内部方法:大版本升级若重构该方法,本插件以「告警 + 透明降级」失败(等效回到现状),不会破坏会话,届时跟版适配。
  3. 白名单 = 授权 agent 对该目录免审批写入,请刻意收窄范围。

回滚

dsh plugin --profile web remove dsh-fs-allowlist(或清空 fs-allowlist.json)+ 重启 DSH。

内容来自项目 README(GitHub)↗

评论

评论存放在 GitHub Discussions。用 GitHub 账号登录后可发表评论或点表情。