前言¶
在 DeepSeek Harness(DSH)里让 Agent 执行需要 root 权限的命令时,常见做法是让用户在聊天里输入密码,或把密码写进工具参数。这两种路径都会让凭据进入会话记录和模型可见范围。dsh-plugin-sudo 提供名为 sudo_run 的工具:需要密码时,DSH 的提问面板以掩码方式收集 sudo 密码,密码经 JSON-RPC 进入插件进程,再写入 sudo 的 stdin,不经过聊天消息、工具参数字段或工具结果里的明文展示。模型侧通常只能看到 command 以及返回的 stdout / stderr。
下面按定位、能力、安装、用法、边界与限制说明该插件,便于在信任源码的前提下接入 profile。
这是什么¶
dsh-plugin-sudo 是面向 DeepSeek Harness 的插件,维护者为 lovesion,社区目录分类为 admin-security。仓库:https://github.com/lovesion/dsh-plugin-sudo,许可证 MIT,当前 package 版本 0.1.0(见仓库 package.json)。
数据路径可概括为:
提问面板(掩码输入) ──▶ 插件进程内存 ──▶ sudo 的 stdin ──▶ child stdin
插件仅依赖 Node 内置的 node:child_process,无 npm 依赖,也无需构建;实现集中在 index.mjs(README 称约 177 行),安装前可自行通读。
核心功能¶
经 README 核实的能力如下。
- 工具名:
sudo_run。 - 先执行
sudo -n true:若 sudo 时间戳仍有效,则复用系统已有凭据,不再弹密码。 - 否则通过宿主
userQuestions服务发起secret: true的提问,标题为「sudo 密码」;description参数会出现在提示文案中。 - 密码通过
sudo -S -p ''的 stdin 传入(不经 argv,ps不应看到密码参数);相关 Buffer 会用Buffer.fill(0)清零。 - 用户未输入或取消时返回退出码
130,避免静默失败。 - 返回结构为
{ exitCode, stdout, stderr };非零退出码视为正常执行结果,由 Agent 自行判断。超时退出码124。 - stdout / stderr 各只保留末尾 32 KB。
宿主需提供 tools 与 userQuestions 两个服务(README 兼容性说明)。
安装与启用¶
当前包未发布到 npm,README 中的「方式二」dsh plugin --profile dsh-tui add dsh-plugin-sudo 暂时不可用。可按下面方式一接入 dsh-tui profile。
- 将仓库放到 profile 的插件目录(
DSH_HOME默认为$HOME/.dsh):
git clone https://github.com/lovesion/dsh-plugin-sudo.git \
"${DSH_HOME:-$HOME/.dsh}/profiles/dsh-tui/plugins/dsh-plugin-sudo"
- 在该 profile 的
cordis.patch.yml末尾追加:
- insert:
- id: tool-sudo
name: "./plugins/dsh-plugin-sudo/index.mjs"
- 重启 DSH,或等待 Cordis 热重载后,在工具列表中应能看到
sudo_run。
README 记载在 DSH 0.19.0、Node.js 26、Arch Linux 上测试通过;package.json 要求 Node >=20。
典型用法¶
调用 sudo_run 时参数如下(摘自 README 表格)。
| 参数 | 必填 | 说明 |
|---|---|---|
description |
是 | 命令的主动语态短描述,显示在密码提示里 |
command |
是 | 用 bash -lc 执行的命令 |
timeoutMs |
否 | 超时毫秒,默认 120000,上限 600000 |
示例形态(具体命令按本机环境替换):
{
"description": "安装系统包",
"command": "pacman -Syu --noconfirm some-package",
"timeoutMs": 120000
}
Agent 根据返回的 exitCode、stdout、stderr 决定下一步;超时为 124,取消为 130。
适用场景与注意¶
适合谁: 经常在 DSH 中让 Agent 执行需 root 的一次性命令(改配置、装包、读受限路径等),且希望密码不进入聊天与模型上下文的开发者。
运行权限: 插件随当前 DSH 进程加载;sudo_run 代表你在本机授权提权。安装前请阅读 index.mjs 并确认信任维护者与 MIT 许可下的行为。
安全边界(README 原文要点): 密码在 JSON-RPC 应答中从提问面板直达插件内存,插件声称不记录、不落盘;JS 字符串不可原地擦除,Buffer 部分已清零。插件不自行缓存密码,依赖 sudo 自身时间戳。
已知限制:
sudo若配置requiretty,stdin 管道会失败。- 不要直接把
yay/paru作为command:它们内部再调 sudo 时拿不到 stdin,可能报「读取密码需要一个终端」。应改用等效的pacman命令,或先在终端执行sudo -v。 - 若提问面板未显示为掩码(
•),可能是宿主 UI 忽略了secret字段;密码仍不应进入模型上下文,但输入时可能可见。 - 依赖 Unix 的
sudo,Windows 原生环境不可用。
社区插件目录:https://www.skillhub.cn/plugins/lovesion/dsh-plugin-sudo。该站点为社区收录,与 DeepSeek / 幻方无官方从属关系;DSH 生态一贯是「一切皆插件」,按需选用并自行审计源码即可。
结尾¶
dsh-plugin-sudo 把 root 命令执行收口到 sudo_run:能缓存则用 sudo -n,否则在掩码面板要密码,再经 stdin 交给 sudo。对习惯在 Harness 里交给 Agent 跑运维命令的人来说,价值在于缩小凭据暴露面;接入时以 README 安装步骤为准,并牢记提权插件只应装在你愿意完全信任的 profile 上。