dsh-whitelist-auto-approval:按命令追加可写根,少弹 danger-full-access

前言

在 DSH 里用 bash 工具跑 lark-cli、gh 这类 CLI 时,常见情况是:命令既要写会话工作区,又要写 ~/.lark-cli、~/Library/Application Support/lark-cli/ 或 ~/.config/gh 等用户目录。默认的 workspace-write 沙箱只允许写工作区、/tmp 和系统临时目录,写家目录会被内核拒绝,模型往往会带上 sandbox_permissions: danger-full-access 重试,于是每次都要点授权;若把整个会话切成完全权限,又等于放弃文件隔离。

社区里已有多种「工作区外写入」方案:有的把命令放到沙箱外执行,有的用配置给所有命令统一加可写目录,有的用审批代答。下面介绍的是维护者 laoer 发布的 dsh-whitelist-auto-approval(npm 包名同插件 id,GitHub:laoer/dsh-whitelist-auto-approval),分类为 admin-security。它只做一件事:对命中白名单的可执行文件,在内核沙箱内保留工作区可写,并仅为该次调用追加声明的可写根(默认 $HOME,可用 roots 收窄),从而避免为写 token 或缓存反复申请 danger-full-access,且不把整段会话升权。

这是什么

dsh-whitelist-auto-approval 给 DSH 的 bash 沙箱增加「按命令生效的白名单」。白名单里的 CLI(默认包含 lark-cli、gh)在 macOS / Linux 上仍跑在内核沙箱里;命中规则时,可写根变为「会话工作区 + 规则里的目录」,而不是弹出完全权限授权。非白名单命令行为不变,该弹窗照旧弹。命令只写工作区时不需要本插件——默认沙箱已足够。

和同类做法的差异

README 按「放行后命令在哪执行」做了对比,本插件属于「按命令追加可写根」:匹配到某条规则时,只在沙箱 profile / argv 上 overlay 额外可写根,且仅对该次命中的命令生效;匹配的是经 PATH 解析后的可执行文件,不是任意命令字符串。扩展沙箱目录(如 dsh-write-protect)、带升级授权的白名单(dsh-sandbox-allowlist)、审批代答类插件,要么全局加目录,要么在沙箱外跑——隔离面更大。需要 deny 规则、网络策略或按目录全局授权时,应选用对应方案,而不是指望本插件包揽。

工作原理(简述)

每条 bash 命令会经过 ctx.shell.resolve(request) 得到 sandboxPolicy,再由 ctx.sandbox.confine() 转成 runner 的 argv / profile。插件在 macOS / Linux 上装饰这两步:命中规则则保留 workspaceRoot,设置 extraWritableRoots(默认 $HOME),并在 confine 阶段按 runner 追加 overlay(Seatbelt 追加 SBPL、bwrap 加 --bind、Landlock 加 --rw)。overlay 失败时退回原策略并告警,失败安全——宁可多弹窗,不会误放行。Windows 或无法识别 runner 时退回旧行为(把可写根换成 $HOME),因 ACL 沙箱无法像 POSIX 那样追加 profile。

匹配规则(开发者需要知道的边界)

插件根据「整条命令的写足迹是否落在被信任程序的写足迹内」判定是否放行,而不是简单 substring 匹配(除非显式使用 shape: any)。

在默认 shape: strict 下:

  • 管道第一段必须是白名单程序:argv[0] 经 PATH + realpath,且可执行文件不能落在工作区 / /tmp / 系统临时目录(防同名脚本劫持)。
  • 后续管道仅允许写中立过滤器:tail、head、wc,参数为数字或固定开关;不允许 tee、| sh、sed -i 等。
  • 重定向只允许不打开路径的形态,如 2>&1、>/dev/null。
  • 拒绝 ;、&&(除可选的 cd <dir> && 前缀)、命令替换、heredoc 等;allowCdPrefix 默认可剥掉 cd /repo && lark-cli ...。
  • ./lark-cli 或 /tmp/.../lark-cli 等模型指定的路径形式不匹配。

插件还会注册系统提示段 tool:bash:auto-approval,把当前规则告诉模型;可通过 promptHint: false 关闭。规则可在设置页修改,下一轮对话生效,不必在每个仓库的 AGENTS.md 里重复。

窄化可写范围时,README 建议先用 roots 列出 app 私有目录并保持 strict,确认无新的 file access denied 后,再对确需复杂 shell 写法的规则单独设 shape: any(有额外安全代价,且 any 配整棵 $HOME 会在加载时被丢弃)。

核心功能

  • 按命令白名单在内核沙箱内追加可写根,默认放行 lark-cli、gh,避免仅为写用户目录反复 danger-full-access。
  • macOS / Linux 通过 Seatbelt / bwrap / Landlock overlay 实现「工作区 + 额外根」;不替换官方 row,不改审批策略与会话模式。
  • 设置页 命令自动放行(或 Plugins → Command Auto-Approval → bash-sandbox-auto-approval)管理规则表;保存写入 profile 的 cordis.patch.yml,对下一次 bash 调用立即生效。
  • 高级项(audit、extraPath、allowCdPrefix、upgradeFromReadOnly、trace 等)可在 ~/.dsh/profiles/<profile>/cordis.patch.yml 中整段覆盖同 id 的 config(注意是同 id 整段替换,非合并)。

安装与启用

要求:DSH Desktop(带 profile),macOS 或 Linux,bash 路径。包版本在 npm 上可见(资料中示例为 dsh-whitelist-auto-approval@0.4.0),许可证 MIT。

从 npm 安装(推荐)

在 agent 或支持的环境中:

plugin_manager(action="install_bundle", target="dsh-whitelist-auto-approval")

或在 Desktop Plugins → Add plugin 填写包名 dsh-whitelist-auto-approval(可带版本)。

CLI 管理的 profile 可使用:

dsh plugin add dsh-whitelist-auto-approval

Desktop 的 profile 由应用持有,Desktop 用户请用 Plugins 页或 plugin_manager,不要假设 CLI profile 与 Desktop 互通。

从 GitHub 或本地目录

plugin_manager(action="install_bundle", target="https://github.com/laoer/dsh-whitelist-auto-approval.git")
plugin_manager(action="install_bundle", target="/绝对路径/dsh-whitelist-auto-approval")

装完后若 Plugins 页未出现 bundle,完全退出 DSH 再打开。首次安装或更新后需重启一次以加载 Web 端 client.js;之后在 UI 改规则无需重启。

典型用法

在 UI 中管理白名单

经过上面的安装与重启:

  1. 打开左下角 设置;
  2. 左侧点 命令自动放行;
  3. 在规则表增删改 command / name / grant / root 等,点 保存。

例如默认即已包含 lark-cli 与 gh;跑 lark-cli docs +update ... 且需写 ~/.lark-cli 时,命中后应在沙箱内完成写入而不再触发完全权限弹窗(在 strict 形态下命令需符合 README 中的管道与重定向约束)。

收窄可写根(YAML 示例)

仅允许 Lark 相关目录可写、写法仍用 strict:

- name: lark-cli
  command: lark-cli
  roots:
    - ~/.lark-cli
    - ~/Library/Application Support/lark-cli
  shape: strict

高级配置需编辑 profile patch,并保留 bash-sandbox-auto-approval 条目下完整 config 字段。

适用场景与注意

适合:经常在 DSH 会话里调用必须写用户目录的固定 CLI(文档中的 lark-cli、gh),希望减少 danger-full-access 点击,又不愿整会话脱离沙箱的开发者。

不适合:需要 deny 规则、网络策略、或「所有命令共享一组额外可写目录」的场景——应选用 README 对比表中的其他插件。

安全与信任:插件以当前 DSH 进程权限运行;白名单修改仅通过用户 UI 或 profile patch,不注册 agent 可改白名单的工具。安装前请自行查看 GitHub 仓库 源码与 MIT 许可证。grant: full 等在 UI 中有显式警告。社区目录页 skillhub.cn 为独立生态站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-whitelist-auto-approval 把「写家目录」从「每次 danger-full-access」改成「仅对白名单命令追加可写根、仍在内核沙箱内执行」,在 admin-security 类插件里补了按命令粒度收紧隔离这一条路。需要细节、匹配表与 overlay 行为时,以仓库 README 为准。

  • 目录页:https://www.skillhub.cn/plugins/laoer/dsh-whitelist-auto-approval
  • GitHub:https://github.com/laoer/dsh-whitelist-auto-approval
羽毛球分组比赛记分
小程序二维码

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

小夜