工具守卫将 agent 执行的 rm 目标移入 macOS 废纸篓而非直接删除,shell 感知词法器覆盖复合与伪装命令;设置页通用设置中可随时关闭。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:NattoCB/dsh-safe-delete
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
该插件的 README 只有英文版本。
A DeepSeek Harness host-side plugin that makes agent-issued
rmcommands recoverable: targets are moved to the macOS Trash instead of deleted, across GUI sessions, automation runs, headless bridges, and subagents. One switch in Settings → General turns it off — disabled, commands run with native DSH behavior.
Capabilities
- Recoverable deletion — an
rmin command position is denied and rewritten to/usr/bin/trash -v; the model receives a report of exactly what was moved, so nothing silently disappears. - Every session, one guard — registers once on the DSH tools registry; GUI chats, scheduled automations, headless bridges, and subagents are all covered with zero per-session wiring.
- Shell-aware interception — quote-preserving lexer catches
sudo rm,/bin/rm,env/nice-prefixedrm,VAR=x rm, andxargs rminside compound commands (&&,||,;,|). - Fail-safe by design — constructs that could hide an
rm($(...), backticks, subshells, heredocs,eval, nestedsh -c) are denied with guidance instead of rewritten; a failed trash is reported, never retried as real deletion. - Runtime switch — toggle in the web GUI (Settings → General → Safe Delete) or via
POST /safe-delete/config; the state persists across restarts in$DSH_HOME/storages/safe-delete.json.
How it works
The plugin installs one guard on the DSH tools registry. Every bash tool call is scanned before execution:
flowchart LR
A["bash tool call"] --> B{"rm in command<br/>position?"}
B -- "no" --> C["native execution"]
B -- "yes" --> D{"switch on?"}
D -- "off" --> C
D -- "on" --> E{"safely<br/>rewritable?"}
E -- "no: subshell, eval,<br/>heredoc, backticks" --> F["deny with guidance,<br/>nothing runs"]
E -- "yes" --> G["run trash -v, deny the<br/>original, report targets"]
Intercepted calls are denied and re-executed as trash by the guard itself, so quoting and globs survive:
[dsh-safe-delete] intercepted `rm` — the targets were MOVED TO TRASH (recoverable),
not deleted. Original command denied. Targets: build/ dist
trash: build/ → .Trash/build/
Plain non-rm commands pass through untouched; commands that merely mention rm (echo rm, grep "rm " log) are ignored. rm flags (-f, -r, …) are stripped rather than honored: trash moves whole directories natively.
Scope and limits
| Covered | Not covered | |
|---|---|---|
| Commands | rm, sudo rm, absolute-path rm, xargs rm — simple and compound |
find -delete, unlink, git clean, language runtimes' own file APIs |
| Guarantee | intercepted at the guard layer, before execution | the guard is an accident-prevention net for the most common destructive verb, not a sandbox |
sudo rm is intercepted before sudo ever runs, but trashing files that require root can still fail — trash errors are reported verbatim.
Install
dsh plugin --profile web add github:NattoCB/dsh-safe-delete
Restart the DSH web process — host-side bundles and their patches load at process start. On boot the plugin logs rm guard active once.
Configuration
| Surface | How |
|---|---|
| Web GUI | Settings → General → Safe Delete — the switch takes effect on the next bash call, no reload |
| HTTP | GET /safe-delete/config → { "enabled": bool }; POST /safe-delete/config with { "enabled": bool } |
| File | $DSH_HOME/storages/safe-delete.json — { "enabled": bool } |
Default: enabled. A missing or corrupt state file also resolves to enabled — installing the plugin expresses the intent to have the guard, and a corrupt file never silently downgrades protection.
Development
npm test # node --test: lexer, rewrite matrix, guard contract, switch store/API
The lexer/rewriter is exported as exports._internals so tests exercise the real code paths (analyzeCommand, tokenize, splitSegments, makeGuard, ConfigStore, handleConfigRequest).
License
MIT — part of the awesome-dsh-plugin ecosystem.
链接
同类插件
toby-bridges/api-relay-audit★ 884
从 DeepSeek Harness 对 AI API 中转站和 LLM 代理运行本地安全审计,生成 Markdown 报告,覆盖提示词注入、模型替换信号、工具调用改写、错误泄漏、流完整性和按 profile 启用的 Web3 风险。
SeaOf0/dsh-redteam-model★ 716
面向授权安全研究的 DSH 合集:九个工作模式(redteam 总控、渗透测试、代码审计、二进制分析、攻防评估、免杀对抗、应急溯源、云安全攻防、CTF 解题)与十五个运行时插件,设置页管理台支持一键部署、安装、更新与卸载。
howmp/dsh-pentest★ 609
面向 DeepSeek Harness 的授权渗透模式:以探索链路记录目标、线索、资产与漏洞,并在 Web 中可视化展示。
PerryLink/dsh-auto-review★ 233
审批链上的第二模型自动审查:只读审查子代理返回带理由的 allow/deny 结构化裁决,默认 fail-closed。
ADWMC/helm-d#helmd★ 225
单包逆向与渗透测试安全分析插件:首轮工具收敛、领域路由与 33 个工具,覆盖 APK、Web、原生二进制、协议、恶意样本与 LLM 场景的逆向分析、加壳脱壳与 License 破解绕过;内置 H-CoT 评估引擎(语义路由、/hcot 命令)、账本驱动的 Web 工作台与工具货架、磁盘案件工作区(证据链自动存证、E 编号结论校验、上下文压缩后恢复)、GitHub 工具检索与 361 篇按需参考文档。
NanmiCoder/dsh-auto-mode★ 164
在 Workspace Write 与 Full access 之间增加 Auto 权限档:日常操作留在官方 workspace-write 沙箱内,由当前会话模型复核升权与破坏性调用,精确的越界访问按次放行一次,意图不明时询问,命中关键路径则拒绝。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。