← 返回列表
未验证
用 @ 提及服务器,经审批后通过 SSH 执行命令
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/25 · 已提供中文文档
在 DeepSeek Harness 会话中使用 @ 提及服务器,并通过 SSH 在其上运行命令,这一切都处于一个失效关闭的双层审批门之后。
综合分
28.5
GitHub 分
28.5
用户评分
—
★ Stars
1
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add MRZHUH/dsh-remote-server该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
信任档位:仅索引本站尚未对其实装验证,仅收录元数据
- 是什么
- dsh 原生插件 · chat
- 装得上吗
- 本站尚未做安装检查
- 安全吗
- 本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
- 还在维护吗
- 更新放缓:最近一次提交在 31 天前
档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/cordis-plugin-group@deepseek-ai/cordis-plugin-include@deepseek-ai/cordis-plugin-loader@deepseek-ai/dsh-agent@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-atomic-write@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-input-trigger@deepseek-ai/dsh-client-ui-primitives用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
由 DeepSeek 最新模型翻译生成dsh-remote-server
在 DeepSeek Harness 会话中用 @ 提及一台服务器,并通过 SSH 在其上运行命令。
注册一次服务器,然后用自然语言提出你的需求。只读取信息的命令会立即运行;任何会改变状态的命令都会先停下并征求你的同意。
服务器上不会安装任何东西。 没有 agent,没有守护进程,没有入站端口。该插件驱动的是你自己的 ssh 客户端,因此你现有的 ~/.ssh/config——跳板主机、agent 转发、known_hosts——都会原样继续生效。
它长什么样
输入 @ 并选择一台服务器。 该引用会随你的消息一起传递;模型会在每条命令中明确指定目标。
@ 提及菜单列出了已注册的服务器
每台服务器一个页面。 可达性、你填写的描述,以及机器自身的各项数据——主机名、操作系统、CPU、内存、磁盘、运行时长——在一次 SSH 往返中全部收集完成。尚未检查过的服务器会如实说明,而不是显示一个捏造的占位内容。页面标题还会显示已安装的插件包版本。
Servers 设置页面
导入你已有的配置。 导入功能会读取 ~/.ssh/config(或你指定的任意路径),并注册你选中的主机。重新扫描会告诉你哪些已经注册,而不是显示一大片被禁用的行。
从 SSH 配置导入
安装
dsh plugin --profile web add dsh-remote-server
然后照常启动 dsh——dsh web,它等同于 dsh --profile web。
无需手动编辑任何内容,也无需任何放行:已发布的 tarball 已经构建好了。
--profile 指定安装到哪个组合中。一个 profile 是 $DSH_HOME/profiles/ 下的一组可启动插件,因此你可以同时保留一个可用的配置和一个干净的配置;web 就是快速上手时启动的那个。
需要 dsh 命令? 快速上手通过 npx @deepseek-ai/dsh web 运行 harness,无需安装任何东西,因此 dsh 可能不在你的 PATH 中。你可以用 npm install -g @deepseek-ai/dsh 安装一次,或者在下面每条命令前加上 npx @deepseek-ai/dsh——npx @deepseek-ai/dsh plugin --profile web add dsh-remote-server。注意保留作用域:裸写 npx dsh 会拉取一个无关的包,并以 could not determine executable to run 失败。
关于 peer 依赖警告
安装过程会打印一串针对 @deepseek-ai/dsh-、@deepseek-ai/cordis 和 react 的“缺少 peer”警告。这是预期行为,插件可以正常工作。
pnpm 只管理你的 profile 中的树外包。这些 peer 是由 dsh 安装本身提供的内置 bundle,因此它们确实不在 profile 的 node_modules 中,但在运行时确实存在。已验证:即使这些包一个都没安装在 profile 中,插件也能加载,其路由能响应,其浏览器 bundle 也能正常提供。
它们保持声明状态,是因为该包确实需要这些接缝。删除它们会通过移除真实信息来让输出变得安静。
改为从源码安装
dsh plugin --profile web add github:MRZHUH/dsh-remote-server
git 安装获取的是源码,而非构建产物,因此 pnpm 必须运行此包的 prepare 脚本来编译它。在你允许之前,pnpm 会拒绝这样做:第一次 add 会失败,并打印出要添加到你的 profile 的 pnpm-workspace.yaml 中的键。
onlyBuiltDependencies:
- dsh-remote-server
请从 pnpm 自己的消息中复制该键,而不是从这里复制——旧版 pnpm 将其称为 allowBuilds,而该消息对实际运行的版本具有权威性。请如实看待授予它的含义:允许在安装时于你的机器上执行此包的代码。固定一个提交(github:MRZHUH/dsh-remote-server#),这样后续的推送就无法悄悄改变所运行的内容。
请如实看待这一点——允许在安装时于你的机器上执行此包的代码。固定一个提交(github:MRZHUH/dsh-remote-server#),这样后续的推送就无法悄悄改变所运行的内容。从 npm 安装不需要此类许可,因为已发布的 tarball 已经构建完成。
移除它只需一条命令,而你已注册的服务器会保留下来:
dsh plugin --profile web remove dsh-remote-server
发布
发布一个标签与 v 匹配的 GitHub Release 会运行 .github/workflows/publish.yml。该工作流会检出该标签,构建并测试该包,验证标签/版本对,并通过 npm 可信发布以来源证明发布到 npm。为仓库 MRZHUH/dsh-remote-server 和工作流 publish.yml 配置 npm 包的 GitHub 可信发布者;不需要 NPM_TOKEN 密钥。
需要在运行 dsh 的机器上有一个 OpenSSH 客户端。如果缺少 ssh,该插件会在加载时失败,并给出适用于你平台的安装命令,而不是挂载到一个什么都无法运行的状态。
注册服务器
使用 Settings -> Servers -> Add a server,或将它们写入 remote-servers 设置命名空间:
remote-servers:
servers:
- alias: web-01
host: 10.0.0.11
user: ops
tags: [prod, web]
description: edge tier - start here
- alias: db-01
host: db-01.internal.example
port: 2222
identityFile: ~/.ssh/id_ed25519_db
alias 是你在 @ 之后输入的名称,因此它不包含空白字符。身份验证仅基于密钥:identityFile 是 SSH 客户端打开的路径,该插件从不读取、复制或存储密钥材料。password 字段会被拒绝,而不是被存储。
如果服务器拒绝了你的密钥,页面会交给你确切的 ssh-copy-id 命令行,其中你的用户、主机和端口都已填好。
模型能做什么
| 工具 | 它做什么 |
|---|---|
| remote_exec | 在一台已注册的服务器上运行一条命令;返回 stdout、stderr 和退出码。 |
| remote_server_info | 读取服务器已采集的事实信息,或重新探测该机器。 |
审批如何运作
每条命令都会经过一个固定的流程。顺序本身就是关键:
1. 未注册的别名 - 拒绝。不会尝试任何连接。
2. 完全访问 - 在 danger-full-access + never 权限组合下,运行已注册服务器的命令时不会再弹出提示。
3. 高风险规则集 - 确定性匹配会强制交由人工决策。分类器无法覆盖它。
4. alwaysAsk - 设置后,从这里开始的所有内容都会交由人工处理。
5. 只读允许列表 - 对已配置前缀的普通调用会立即运行。
6. 模型分类器 - 对剩余内容给出 auto 或 human 的答复。
7. 人工审批 - 通过 harness 审批渠道进行询问。
任何无法达到明确“通过”的内容最终都会交由人工处理,而无法联系到人工时最终会拒绝。分类器超时、出错或给出含糊答复都不算通过——拒绝分支是代码中的默认路径,而不是错误处理器。
九类高风险操作:递归删除、磁盘和文件系统写入、关机和重启、服务停止和重启、用户和权限变更、软件包安装和卸载、写入系统路径、权限提升,以及读取凭据或密钥路径。
启用模型自动审批
在你指定模型之前,自动审批会一直处于关闭状态,因为插件无法知道你的部署组合了哪个提供商。在你的 profile 的 cordis.patch.yml 中:
- id: remote-server
config:
classifier:
provider: deepseek
model: deepseek-chat
这里不涉及 API 密钥——插件永远看不到密钥。它调用 ctx.llm,由 harness 解析它已持有的凭据。两个字段要么都设置,要么都不设置;只设置一半会在加载时失败。
配置
| 键 | 默认值 | 含义 |
|---|---|---|
| connectTimeoutMs | 10000 | 建立连接的超时上限。 |
| execTimeoutMs | 120000 | 单条命令的超时上限。 |
| probeTimeoutMs | 15000 | 单次事实探测的超时上限。 |
| outputMaxBytes | 65536 | 每个流保留的字节数;溢出时保留尾部,并报告为已截断。 |
| strictHostKeyChecking | accept-new | 未知主机密钥策略(accept-new 或 yes)。 |
| alwaysAsk | false | 将每条命令都交由人工处理。 |
| readOnlyAllowlist | [] | 跳过分类器的命令前缀。 |
| classifier | 未设置 | 用于自动审批的 { provider, model }。 |
| classifyTimeoutMs | 15000 | 单次分类调用的超时上限。 |
在依赖此功能之前值得了解的局限性
完全访问会绕过此插件的审批阶段。 这是该预设的明确承诺:已注册服务器的命令无需再次提示即可运行,包括被高风险规则集匹配的命令,以及配置了 alwaysAsk 的部署。SSH 用户自身的权限仍然适用。
高风险规则集是噪声过滤器,不是安全边界。 在完全访问之外,它匹配的是命令文本。一个经过混淆的 rm、一个 base64 解码后的载荷,以及一次对执行破坏操作的脚本的调用,都能径直绕过它。真正限制损害的是:默认倾向于询问你,以及 SSH 用户在目标上的自身权限仍然适用。为该用户授予工作所需的最小权限,并在不接受任何自动放行的地方设置 alwaysAsk: true。
accept-new 信任它看到的第一个密钥。 首次连接到从未到达过的主机时,会记录任何应答的密钥;之后的变更会被拒绝。这就是首次使用信任(trust-on-first-use),而通过敌对网络的首次连接可能被拦截。在重要场合,设置 strictHostKeyChecking: yes 并预先填充 known_hosts。不提供 ask:此处的认证是非交互式的,因此提示只会失败。
超时或取消不会终止远程进程。 它只是停止这一侧的等待。远程命令可能仍在运行,结果会如实说明这一点,而不是声称已终止。长时间工作请在 nohup 或 tmux 下运行。
退出码 255 是有歧义的,插件也如此说明。 它既是 SSH 客户端报告自身失败时使用的代码,也*是你的命令的合法退出码。当 stdout 为空且 stderr 文本不匹配任何已知的客户端失败时,结果会被报告为 ambiguous——并附带客户端自身的消息——而不是断言一个从未被观察到的远程退出码。
凭据脱敏是尽力而为的。 已识别的密钥格式会在任何内容到达会话日志、工具结果或屏幕之前被替换。它减少暴露,但不保证没有暴露。结构性保护在于:插件自身从不读取密钥材料。
读取 SSH 配置就是以你的身份读取你指定的路径。 提供导入功能的路由在你的本地 dsh 进程中运行。Web 服务器默认绑定 127.0.0.1;将其绑定到网络地址会使该访问路径连同其他一切一并暴露。
可审计性
每次执行和每次拒绝都会追加一个 remoteServer/exec 会话事件,记录目标、命令(已脱敏)、由哪个门控阶段决定、原因以及结果。被拒绝的尝试不携带退出码,因为没有运行任何东西。模型被告知的一切都可以仅从日志中重建。
开发
npm install
npm test
npm run typecheck
npm run build
npm test 会先构建,因此测试套件始终针对最新输出运行。
设计文档——规范、计划、研究、契约以及验证指南——位于 specs/ 下,并随代码一同提供。
许可证
MIT