🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

远程 SSH 工作区 zzaccount/dsh-remoteSSH

DeepSeek Harnessv0.2.4
zzaccount34 天前有提交已提供中文文档扫描:含敏感能力

把对话执行位置切到远程 Linux 服务器上

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:engines.node 要求 >=24.0.0,不满足 Node 22.19.0。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add zzaccount/dsh-remoteSSH
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 34 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

engines.node 要求 >=24.0.0,不满足 Node 22.19.0

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-remote-ssh @ 0.2.4
✗Node 引擎要求 >=24.0.0 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/6 16:18:40

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 33 处,展示前 28 条)
  • 发起网络请求
    dist/index.js:5046
    if ("function" === typeof fetch && !W.startsWith("file://")) return fetch(W, { credentials: "same-origin" }).then(function(a) {
  • 发起网络请求
    dist/index.js:5162
    return J || "function" !== typeof WebAssembly.instantiateStreaming || W.startsWith(V) || W.startsWith("file://") || "function" !== typeof fetch ? d(c)
  • 读取本地文件
    dist/index.js:13535
    readFile(path2, options, callback_) {
  • 写入本地文件
    dist/index.js:13635
    writeFile(path2, data, options, callback_) {
  • 写入本地文件
    dist/index.js:13727
    rename(oldPath, newPath, cb) {
  • 写入本地文件
    dist/index.js:13748
    mkdir(path2, attrs, cb) {
  • 读取本地文件
    dist/index.js:13887
    stat(path2, cb) {
  • 读取本地文件
    dist/index.js:20371
    return (await stat(path2)).isFile();
  • 读取本地文件
    dist/index.js:20378
    return await readFile(path2, "utf8");
  • 读取本地文件
    dist/index.js:20443
    return [{ privateKey: await readFile(keyPath), label: keyPath }];
  • 读取本地文件
    dist/index.js:20452
    values2.push({ privateKey: await readFile(path2), label: path2 });
  • 写入本地文件
    dist/index.js:22178
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    dist/index.js:22426
    await mkdir2(dirname(this.#file), { recursive: true });
  • 写入本地文件
    dist/index.js:22428
    await writeFile(temp, snapshot, { encoding: "utf8", mode: 384 });
  • 写入剪贴板
    client.js:366
    await writeClipboard(String(text));
  • 写入剪贴板
    client.js:369
    await navigator.clipboard.writeText(String(text));
  • 发起网络请求
    client.js:1587
    const response = await fetch(`${RPC_BASE}/${String(method)}`, {
  • 读取本地文件
    src/connection-manager.js:25
    try { return (await stat(path)).isFile() } catch { return false }
  • 读取本地文件
    src/connection-manager.js:29
    try { return await readFile(path, 'utf8') } catch { return '' }
  • 读取本地文件
    src/connection-manager.js:93
    return [{ privateKey: await readFile(keyPath), label: keyPath }]
  • 读取本地文件
    src/connection-manager.js:102
    try { values.push({ privateKey: await readFile(path), label: path }) } catch {}
  • 读取本地文件
    src/connection-manager.js:119
    try { values.push({ privateKey: await readFile(path), label: path }) } catch {}
  • 读取本地文件
    src/remote-subprocess.js:110
    const bytes = await readFile(path)
  • 写入本地文件
    src/server-workspace.js:165
    await mkdir(dir, { recursive: true })
  • 读取本地文件
    src/store.js:81
    try { return JSON.parse(await readFile(path, 'utf8')) }
  • 写入本地文件
    src/store.js:138
    await mkdir(dirname(this.#file), { recursive: true })
  • 写入本地文件
    src/store.js:140
    await writeFile(temp, snapshot, { encoding: 'utf8', mode: 0o600 })
  • 写入本地文件
    src/store.js:141
    await rename(temp, this.#file)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-bash-local@deepseek-ai/dsh-tool-terminal@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-fs@deepseek-ai/dsh-fs-observation-policy@deepseek-ai/dsh-jobs@deepseek-ai/dsh-shell
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 切换远程服务器工作区
  • 远程执行与终端
  • 读取服务器文件树

通过 SSH 在远程 Linux 服务器上运行 DeepSeek Harness 对话:服务器工作区、远程执行/终端,以及读取服务器的侧边栏文件树。

README

由 DeepSeek 最新模型翻译生成
DSH Remote SSH DSH Plugin Release Node.js 24+ Remote SSH License: MIT 让 DeepSeek Harness(DSH) 使用原生工具直接操作远程 Linux 服务器。 每台服务器就是左侧工作区里的一个分组。 保存服务器后,插件会在本地为它建立一个同名工作区;在这个工作区里新建的对话自动在这台服务器上执行,这个分组下的会话就是这台服务器的工作区会话。DSH 原有的 read / write / edit / glob / grep / bash / terminal 会切换到远端执行。插件不修改 DSH 源码,服务器也无需安装 DSH、本插件、Node.js 或 Python。 功能 - 在 DSH 页面内添加、测试、管理和选择 SSH 服务器。 - 一台服务器 = 左侧工作区里的一个分组,组内对话默认在这台服务器上执行。 - 服务器里的任意文件夹也可以加成子工作区(缩进显示在服务器分组下面),在这个子工作区里新建的对话直接在那个远端目录里执行。 - 也可以随时把当前对话在本地电脑与已添加的服务器之间切换:执行位置只在这条对话行上的 🌐 菜单里显式选择时改变(从空对话行或面板添加 / 编辑服务器都不会顺手切换对话)。
展开完整文档(README 剩余 1 节)
DSH Remote SSH

DSH Plugin
Release
Node.js 24+
Remote SSH
License: MIT

让 DeepSeek Harness(DSH) 使用原生工具直接操作远程 Linux 服务器。

每台服务器就是左侧工作区里的一个分组。 保存服务器后,插件会在本地为它建立一个同名工作区;在这个工作区里新建的对话自动在这台服务器上执行,这个分组下的会话就是这台服务器的工作区会话。DSH 原有的 read / write / edit / glob / grep / bash / terminal 会切换到远端执行。插件不修改 DSH 源码,服务器也无需安装 DSH、本插件、Node.js 或 Python。

功能

- 在 DSH 页面内添加、测试、管理和选择 SSH 服务器。
- 一台服务器 = 左侧工作区里的一个分组,组内对话默认在这台服务器上执行。
- 服务器里的任意文件夹也可以加成子工作区(缩进显示在服务器分组下面),在这个子工作区里新建的对话直接在那个远端目录里执行。
- 也可以随时把当前对话在本地电脑与已添加的服务器之间切换:执行位置只在这条对话行上的 🌐 菜单里显式选择时改变(从空对话行或面板添加 / 编辑服务器都不会顺手切换对话)。
- 禁用或卸载插件时,插件建立的服务器工作区会随插件从左侧一起消失;重新启用后按服务器列表自动重建。本地占位目录保留(里面不放文件),会话记录不受影响。
- 保留 DSH 官方工具,不新增能力受限的 ssh_ 替代工具。
- 通过 SFTP 操作文件,通过 SSH exec / Shell 执行命令,通过 SSH PTY 提供交互终端。
- 右侧「工作区文件」列读取的就是这台服务器:可以展开远端目录、打开远端文件、预览文档,路径与远端一一对应(改动通知按 DSH 约定返回「不支持监听」,因此没有实时刷新,手动刷新照常可用)。
- 保留官方 glob / grep,自动处理并缓存远端 Linux 所需的 ripgrep。
- 支持 SSH Agent、私钥文件和临时密码认证。
- 首次连接核对 SSH Host Key 指纹,指纹变化时拒绝连接。
- DSH Host 维护并复用服务器连接,不会为每条消息重新登录。

安装

需要 Node.js 24 或更高版本,并确保 dsh 和 pnpm 可在命令行中使用。已在 DSH 0.2.0-rc.1 上验证(插件跟随 DSH 的 workspace-files 契约)。

dsh plugin --profile web add github:zzaccount/dsh-remoteSSH
dsh web

如果 Windows 提示找不到 pnpm,请在 CMD 中执行 npm install -g pnpm@11,然后重新打开 CMD。

插件新增或更新后需要重启 DSH:Host 侧代码只在启动时加载一次,服务器工作区也是在启动/保存服务器时建立的。

使用

方式一:添加服务器并按服务器分组(推荐)

1. 点左侧工作区栏底部的 服务器工作区。
2. 点服务器一栏右上角的 + 添加服务器(服务器不止一台时旁边还有 管理服务器,可以重连 / 编辑 / 删除)。
3. 填写连接信息、认证方式和默认工作目录,按页面引导准备认证并核对服务器指纹,然后点 测试并保存。
4. 保存后这台服务器会立刻成为左侧工作区列表里的一个分组;点它的 加为工作区 打开一个对话,这个对话就在服务器上执行。
5. 在这个分组里新建的对话同样会自动在这台服务器上执行,不需要再手动切换。

分组的名字来自服务器名字;分组对应的“目录”是插件在本地建立的占位目录(\remote-ssh-workspaces\),它只用于让 DSH 记住归属,真正的文件和命令都在服务器上。默认工作目录仍然由服务器配置里的“默认工作目录”决定。

方式一之二:把服务器里的文件夹加成子工作区

1. 点左侧工作区栏底部的 服务器工作区。
2. 找到目标服务器,点 选择目录…。
3. 在远端目录浏览器里点目录逐层进入(.. 回上级),停到你要用的那个目录。
4. 点 把这个目录加为工作区:DSH 会直接打开这个新工作区里的对话,pwd 就是这个远端目录。

回到左侧工作区列,这个目录会缩进显示在它所属的服务器下面(视图选项需要是「分组方式 = 工作区树」)。同一个远端目录重复添加不会产生第二条:插件按“目录名 + 路径哈希”确定性地复用已有工作区。弹窗下方还会列出已添加的远端目录,可以一键打开,或“移除” —— 移除会同时删掉左侧的那一行工作区(本地占位目录和已有会话都保留,重新选一次同一目录即可加回来)。

在这个入口里点某台服务器的 加为工作区,等于把整台服务器加成工作区(和方式一相同)。

方式二:把某一条已有对话切到服务器上

1. 鼠标移到左侧工作区列表里那一条对话行上,点它的切换按钮(🌐)。
2. 选择“本地电脑”或某台服务器;这台服务器上如果已经加了子工作区,也可以在同一个菜单里 添加服务器。
3. 切换只影响这一条对话。
每条对话各自记住自己的执行位置:左侧列表里凡是走远端的对话行,前导位置会显示一个地球标记,鼠标移到该行时还会出现那个切换按钮。分组内新建的对话以所属服务器为准,手动指定的执行位置始终优先。添加/管理服务器以页脚的「服务器工作区」面板为主要入口;会话行那个菜单里也各留了一行,方便把这条对话直接指到一台还没保存过的服务器上。

注意:DSH 只在已经发过消息的对话行上留出这个按钮的位置。刚新建、还没发过消息的对话想直接跑在服务器上,请走方式一 —— 在服务器分组里新建对话(它的工作目录从建出来就在服务器上)。

界面预览

前两张截图拍摄于 1.0.6:当时从页脚「执行位置」选择器进入。1.0.7 起入口改为页脚 服务器工作区,添加 / 编辑 / 管理服务器都在那一个面板里;切换某条对话则用它所在行上的 🌐 动作。截图待重新拍摄后替换。

添加并配置 SSH 服务器

添加并配置 SSH 服务器

在本地与远程执行环境之间切换

切换执行环境

使用 DSH 原生工具操作远程服务器

远程服务器执行效果

架构

flowchart TB
M[Model]
T[DSH 官方工具read · write · edit · glob · grep · bash · terminal]
I[DSH 官方执行接口ctx.fs · ctx.subprocess · ctx.shell · ctx.terminals]

M --> T --> I

subgraph W[Execution World]
direction LR

subgraph L[Local]
LP[DSH 原生 Provider]
LOS[本地操作系统]
LP --> LOS
end

subgraph R[Remote SSH]
RP[DSH Remote SSH Provider]
FS[SFTP远程文件系统]
EX[SSH exec进程 / Shell]
PTY[SSH PTY交互终端]
RG[官方 glob / grep 参数远端 Linux ripgrep]

RP --> FS
RP --> EX
RP --> PTY
RP --> RG
end
end

I --> LP
I --> RP

原生 DSH @ Linux ≈ DSH @ 本地电脑 + DSH Remote SSH → 同一台 Linux

插件只改变 DSH 在哪里执行,不改变 模型如何使用 DSH 工具。详细实现见 ARCHITECTURE.md。

认证

| 方式 | 说明 |
| SSH Agent | 插件只请求 Agent 签名,不读取私钥正文,也不启用 Agent Forwarding;适合个人桌面环境 |
| 私钥文件 | 只保存密钥路径,连接时读取文件;适合专用账号或服务端部署 |
| 临时密码 | 只保存在当前 DSH Host 进程内存,重启后需要重新输入 |

远端要求与安全边界

- 目标为提供 SSH / SFTP 和 POSIX Shell 的 Linux / Unix 主机。
- 每台服务器可设置默认工作目录;它是默认 cwd,不是路径沙箱。
- 实际访问能力等同于远端 SSH 账号权限。
- Remote Provider 不会向远端暴露 DSH Host 的本地文件系统。
- 模型 API Key、Base URL 等仍由 DSH 管理,本插件不读取或保存。

更多说明见 SECURITY.md。

更新与卸载

dsh plugin --profile web update dsh-remote-ssh
dsh plugin --profile web remove dsh-remote-ssh

更新或卸载后重新启动 DSH。

开发

源码是纯 ESM JavaScript,没有 TypeScript 环节;DSH 实际加载的 dist/index.js 是 src/index.js 的 esbuild 打包产物。

git clone https://github.com/zzaccount/dsh-remoteSSH.git
cd dsh-remoteSSH
npm install
npm run check

npm run check 是本仓库唯一的验收命令:重新打包 dist/index.js、对 src 跑 scripts/check-undefined.mjs、对每个源码文件以及 bundle 与 client.js 做语法检查,最后跑 node --test。test/ 不依赖任何第三方包,只 import node: 与插件自身的纯模块,因此不需要安装 DSH 也能跑通。

src/index.js Host 入口:配置、工作区列、服务器面板、接线 src/connection-manager.js SSH/SFTP 连接池、认证、Host Key 校验 src/remote-fs.js 基于 SFTP 的文件系统 provider src/remote-subprocess.js 子进程 / Shell / PTY provider src/remote-realm.js 挂载隔离的执行世界(fs、subprocess、terminal、策略、工具) src/workspace-files-bridge.js 把官方 workspace-files Remote 路由到某个服务器世界 src/server-workspace.js 服务器工作区与远端目录工作区 src/store.js 持久化的服务器 / 目标 / 工作区状态 client.js Web UI:工作区列的行、服务器面板、各种对话框 scripts/build-host.mjs esbuild 打包到 dist/index.js scripts/check-undefined.mjs 静态闸门:被调用的名字必须在本模块内有绑定 test/ node --test 测试

@deepseek-ai/* 都是由 DSH 提供的 peer 依赖,所以测试刻意不 import 它们:test/ 覆盖纯模块(路径翻译、工作区文件桥、store、服务器工作区映射),而只在 DSH 内部才能加载的模块由 scripts/check-undefined.mjs 兜底 —— 否则那里一个未定义引用会因为没有任何测试能 import 它而悄悄发版。

文档

- ARCHITECTURE.md — 架构与实现
- SECURITY.md — 安全模型与凭据处理
- CHANGELOG.md — 版本变更
- CONTRIBUTING.md — 开发与贡献
- docs/服务器工作区-交互设计.md — 服务器工作区面板的交互设计
- docs/prototype-服务器工作区.html — 该面板的可点击原型,用浏览器直接打开
- THIRD_PARTY_NOTICES.md — 随发布打包的第三方组件

致谢与上游

本仓库是衍生作品:起点是 NaNQiQ/deepseek-harness-remote-ssh(MIT),git 历史完整保留,原始版权声明保留在 LICENSE 中。在其之上的工作把页脚 服务器工作区 面板做成添加与管理服务器的唯一入口(1.0.7),并新增了让右侧文件树直接读取服务器文件系统的桥接(1.0.8)。

相关项目

- DeepSeek Harness

友链

LINUX DO

License

MIT
预览分享卡片长什么样 ↓zzaccount/dsh-remoteSSH
分享 · DeepSeek Harness Hub
zzaccount/dsh-remoteSSH

把对话执行位置切到远程 Linux 服务器上

这是你的仓库?认领条目

回到顶部