dsh-plugin-sudo:在掩码面板里提权,密码不进对话与模型上下文

前言

在 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。

  1. 将仓库放到 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"
  1. 在该 profile 的 cordis.patch.yml 末尾追加:
- insert:
    - id: tool-sudo
      name: "./plugins/dsh-plugin-sudo/index.mjs"
  1. 重启 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 上。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye