跳到主内容

dsh-remote

31Star8Fork3Issue0Watching

DSH 远程工作区助手:保存多台 SSH 主机,把远程目录镜像成本地工作区,让 Agent 直接读写远程文件、跑命令、转发端口。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
JavaScript
License
MIT
分支
main
deepseek-harnessdshdsh-pluginremotesftpsshtunnelworkspace

安装

命令web profile
$ dsh plugin --profile web add dsh-remote

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 flymysql/dsh-remote:先查看仓库 https://github.com/flymysql/dsh-remote 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

把 DSH 的工作区从「本机目录」扩展到「任意 SSH 主机上的目录」:保存多台主机、一键镜像远端目录成 DSH 原生工作区,让 Agent 跨网操作远端文件、跑命令、开隧道。

核心能力

  • 多主机 SSH 管理:在「设置 → 远程工作区」保存任意数量台主机(host/port/user + 私钥或密码),一键切换当前机;支持私钥口令、OpenSSH Agent、键盘交互(OTP/MFA)、跳板机(ProxyJump)。
  • 远程工作区选择器:填充 DSH 原生「Add workspace」流程,弹窗分「本机」和「远程」两个 tab,默认落在本地;切远程后选机器、输入或浏览远端路径即可生成镜像工作区。
  • 21 个 rw_* 模型工具:info / connect / pick_workspace / list_dir / stat / read_file / write_file / edit / append / mkdir / remove / move / exec / search / download / upload / sync / push / forward / disconnect;rw_exec 可分配 PTY、设环境变量,rw_edit 带 mtime 乐观锁。
  • 双向 SFTP 同步:rw_sync(远端→镜像)和 rw_push(镜像→远端)走三路对比,识别冲突但不覆盖,可 dryRun 预演、async 后台运行、force 覆盖;默认有单文件大小上限、忽略规则(gitignore 语法)。
  • SSH 端口转发:本地正向和远程反向隧道,在设置面板或 rw_forward 里增删启停;记入 forwards.json,可设自动重连,连接断开时一并停掉。
  • 主机指纹 TOFU 校验:首次连接记录指纹到 known_hosts.json,之后指纹变更立即拒绝;提供 accept-new / verify / off 三档。
  • 侧边栏远程文件:自带 dsh-better-sidebar,提供「远程文件」目录树 + 可视化编辑器(含「编辑 → 保存到远程」流程与 mtime 乐观锁保护、409 提示重读)。
  • 命令审计日志:所有 rw_exec / 写 / 删 / 移 / 转发操作追加到 audit.log,设置面板里可看最近若干条。
  • 可选系统钥匙串存密码:勾选「加密保存密码」时把单台机器密码交 macOS Keychain / Windows DPAPI / Linux secret-tool,失败自动回落明文。
  • 自我更新:从 npm 拉版本,支持「manual / auto / off」三档,自动档按可配置间隔静默检查并升级。
  • ~/.ssh/config 导入:设置页面列出你 SSH 配置里的 Host 记录,一键回填表单(仅导入配置路径,不读私钥内容)。

技术实现

  • 语言: JavaScript (ESM, Node.js)
  • 关键依赖: ssh2(SSH/SFTP 客户端,纯 JS 实现无原生绑定)、@deepseek-ai/schemastery(配置 schema 校验)、dsh-better-sidebar(侧边栏 UI,v0.7.2 起硬依赖内嵌挂载)、iconv-lite(GBK 等非 UTF-8 编码读写)
  • 架构模式: 双半插件:宿主半(lib/index.js)通过 Cordis inject=['tools','systemPrompt','webServer'] 注册 21 个工具、system-prompt 段落、以及 /dsh-remote/* 16 个 JSON 端点;客户端半(lib/client.js)通过 window.__ModuleLoader__ 注册 React UI(设置页面、远程工作区选择器补全、侧边栏入口),优先级 -100 填充 directory-flow hooks。所有文件操作走 SFTP 协议层,POSIX 和 Windows 远程都支持。
  • 入口文件: lib/index.js(宿主半)+ lib/client.js(客户半),搭配 cordis.patch.yml(自动插入本体与侧边栏两行)

适用场景

需要让 DSH Agent 操作远端开发机/部署机/内网服务器上的代码与命令:典型场景是本地编辑代码不方便或文件本身就只在远端;远程构建/部署、运维检查、跨网协作时把远端目录镜像成 DSH 真实工作区。适合需要双击切换多台机器、用私钥或密码登录、跳板进内网、临时开几条 SSH 隧道的用户。

前置依赖与兼容性

依赖最低版本说明
DSH(DeepSeek Harness)^0.1.0-rc.6包内 peerDependencies 声明,需要 @deepseek-ai/dsh-commands / @deepseek-ai/dsh-host-webserver / @deepseek-ai/dsh-tools / @deepseek-ai/dsh-system-prompt / 两个 client runtime 包同版本号
Node.js未声明仓库未设 engines,但代码使用 node:zlib 的 zstd、node:fs/promises 等较新接口,建议使用当前 LTS
平台macOS / Windows / Linux客户端、宿主、远端均跨平台;远端读写走 SFTP 协议层,不挑 shell
原生模块无ssh2、iconv-lite、schemastery、dsh-better-sidebar 均为纯 JS
pnpm linkerhoistedprofile 的 pnpm-workspace.yaml 必须保持 nodeLinker: hoisted,否则内嵌侧边栏行无法解析 dsh-better-sidebar(README.zh.md:61)

安装方式

dsh plugin --profile web add github:flymysql/dsh-remote

配置项

本插件无需在安装时手动配置;首次使用在「设置 → 远程工作区」里以图形界面添加主机。cordis.patch.yml 也可声明一台默认主机(详见 README §「可选:CLI 默认机」)。Schema 字段(lib/index.js:55)解释如下:

配置类型说明默认值
host字符串当前主机的 SSH 地址;空字符串表示插件启动后保持断开状态''
port整数 1–65535SSH 端口22
username字符串登录用户名''
password字符串密码(非空时优先于私钥);触发 OS keychain 时实际值不在此处''
privateKeyPath字符串私钥路径(显式提供才用,绝不自动读 ~/.ssh)''
passphrase字符串加密私钥的口令''
workspace字符串默认远端工作区绝对路径''
commandTimeoutMs整数 ≥ 1000单条远端命令超时(毫秒)20000
connectTimeoutMs整数 ≥ 1000SSH 建立连接超时(毫秒)15000
maxOutputChars整数 ≥ 1024单次远端命令输出最大收集量200000
maxFileBytes整数 ≥ 0镜像同步时跳过超过该大小的文件,0 = 不限52428800(50 MB)
hostKeyMode字符串accept-new(首次信任)/ verify(拒绝未知主机)/ off(关闭,不推荐)accept-new
useAgent布尔使用 SSH_AUTH_SOCK 上的 OpenSSH Agent(无密码/私钥时启用)false
keyboardInteractive布尔允许键盘交互认证(OTP/MFA 链),用本机密码应答false
proxy对象跳板机/堡垒机 {host, port, username, password, privateKeyPath};空 host 表示不用默认空对象
autoPush布尔本地镜像改动后自动推回远端(3s 防抖,过滤忽略规则和三路冲突)false
auditLog布尔记录每次执行/写/删/移/转发到 audit.logtrue
encoding字符串远端文本读写编码(默认 utf-8,可写 gbk 等)utf-8
updateMode字符串manual(手动)/ auto(启动+周期检查并自动升级)/ off(关闭)manual
updateCheckIntervalMs整数 ≥ 60000auto 模式下检查 npm registry 的间隔(毫秒)21600000(6 小时)

补充:用户机器清单里还有「privateKeyPath / passphrase / SSH Agent / 跳板机 / 加密保存密码」等表单字段(详见设置页),每条记录可独立覆盖上述字段。

常见问题

Q: 多机器怎么切换?

A: 在「设置 → 远程工作区」列表里点任意机器的「设为当前」即可;切换后该机器上的 workspace 与端口转发一并激活;用 rw_* 工具时也会作用到当前机器。也可用 Model 的 rw_connect 在工具调用里临时换机器(save=false 即不写入清单)。

Q: 远端工作区对应到我机器的哪个本地文件夹?能挪走吗?

A: 默认在 $DSH_HOME/remote-workspaces/<host>-<user>-<port>/<basename>; 重复时追加短哈希。删除该目录仅删本地镜像,不会动远端;要从迁移前的旧位置(~/.dsh/remote-workspaces)找到则自动覆盖。如想自定义镜像位置,可用 rw_download 显式 localPath= 把单文件下载到任意位置。

Q: 能中途改 SSH 私钥/密码吗?改了之后必须重启吗?

A: 不必重启。改完保存设置 → 触发 applyActiveMachine,底层 SshPool.setTarget 会 bump epoch、丢弃旧连接,下次工具调用用新凭据建立新连接;当前活跃 SSH 连接立即失效。

Q: 端口转发重启 harness 后还在吗?

A: 定义在 forwards.json 里,永久保存;勾选「自动启动」的转发在每次连接建立后会被自动拉起。

Q: 同步时两边都改了会怎样?

A: 标记为冲突并保留两侧不被覆盖,控制台报告冲突路径和原因;可在 UI 或工具调用里加 force=true 强行用本地覆盖远端(rw_push)或反之(rw_sync)。

Q: 错误「没有 host + workspace configured — call rw_connect with a host to get started」是什么意思?

A: 插件没拿到任何机器配置;在设置页加主机,或在工具调用里用 rw_connect 临时连一台。

Q: 能从 ~/.ssh/config 复用配置吗?

A: 可以。设置页面有「导入 SSH 配置」按钮,一键回填 Host/HostName/User/Port/IdentityFile/ProxyJump;只导入路径引用,不会读取任何私钥内容。

Q: 端到端的安全风险在哪?

A: 把机器凭据交给本插件,等于让 Agent 以你的身份在远端跑 shell 命令;只添加你信任的机器,并把 audit.log 当敏感数据对待;可在文件系统层收紧 ACL(audit.log / machines.json / .secrets/)。所有远端命令都经过 shell-转义、cd 工作目录也走 shq 引号包裹,单引号直传不展开。

上手难度

入门 — 添加主机、选工作区即用;常见配置(密码/私钥/Agent/跳板)有 UI 表单,模型工具调用也按 rw_list_dir / rw_read_file 这类自然语言动词命名。进阶点(自动同步、端口转发、TOFU 策略)保持默认即可工作。

已知问题与限制

  • 本机目录选择器在某些发行版 Linux 上依赖桌面会话里的 zenity / kdialog;纯 CLI 环境(无 dbus)下会报 ENOENT,可直接在输入框手动填路径(lib/index.js:1797-1819)。
  • SSH 通道空闲被服务端静默关闭时会偶发 Channel open failure: open failed;0.7.3 起会自动失效旧连接并重连一次。仍偶发时可调高 keepalive/connectTimeoutMs 或主动调 rw_disconnect(lib/index.js:516-523)。
  • 同步/搜索有文件大小上限(默认 50 MB)和最大文件数(同步 2000、搜索 500/2000)以避免误拉大文件;可改 maxFileBytes=0 关闭文件大小上限,但不要把同步任务目标指向含数据库或大二进制仓库。
  • audit.log 单进程追加、不分卷,长时间使用需要外部 logrotate。
  • 0.8.6 修复了设置页底部版本号硬编码问题(之前任何版本都显示 v0.8.3)。
  • 0.8.4 修复 dsh 0.1.0-rc.8 加载 0.8.3 时的启动崩溃;升级后请同步升级两者。
  • 内嵌 dsh-better-sidebar 自 0.7.2 引入,要求 profile 的 pnpm-workspace.yaml 保持 nodeLinker: hoisted,否则内嵌行无法解析同名包(cordis.patch.yml:5-18 / README.zh.md:61)。

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/flymysql/dsh-remote)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录