Skip to main content

dsh-ssh/packages/dsh-ssh

24Stars3Forks0Issues0Watchers

Facilitates SSH-based remote workspace connectivity for AI-driven server operations.

Evidence5/5methodologySourceInstallMaintenanceDSH versionSecurity scan
Machine-auditedInstall commandRepo verifieddsh-plugin topicLicenseREADMEAI wiki
Language
TypeScript
License
BSD-3-Clause
Branch
main
dshdsh-plugin

Install

cmdweb profile
$ dsh plugin --profile web add --allow-build=@deepseek-ai/dsh-ssh github:chenw2759-wq/dsh-IDE#path:packages/dsh-ssh

Run the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial

Install via your agent

Install the DeepSeek Harness plugin chenw2759-wq/dsh-IDE/packages/dsh-ssh for me: review the repository at https://github.com/chenw2759-wq/dsh-IDE first, then run the install command and verify the plugin loads successfully.

Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.

一句话定位

dsh-ssh 是 DSH Web GUI 的远程 SSH 运维插件:在浏览器里管理多台 SSH 主机(密钥 / 密码 / ProxyJump 跳板机),跑命令、打开 Web 终端、SFTP 上传下载、做本地端口转发,以及一键并发跑多台主机;同时把这 6 个能力(ssh_list / ssh_exec / ssh_upload / ssh_download / ssh_tunnel / ssh_cluster)暴露给 Agent,GUI 和 AI 共用同一份主机配置与连接池。

核心能力

  • 管理多台 SSH 主机:在 Web 界面增删改查、搜索、测试连接;支持密钥 / 密码认证、passphrase 加密密钥、ProxyJump 多级跳板机;配置可一键从标准 ~/.ssh/config 导入
  • 执行远程命令:单条命令带超时(默认 60 秒)、stdout/stderr 分离、2MB 输出截断保护,断线自动重连最多 3 次;并发集群执行可按别名 / 环境 / 标签过滤,默认并发 8
  • Web 终端:xterm.js + WebSocket PTY 终端,自适应列/行尺寸,带 1MB / 512KB TCP 背压暂停 / 恢复
  • SFTP 传输:上传走 NDJSON 进度流、下载走二进制流附 Content-Disposition,远程目录浏览会跟符号链接并按批并行 stat
  • 本地端口转发隧道:把远程内网服务的端口映射到 127.0.0.1,访问远程数据库 / Web UI 只需连本地端口;支持列表 / 停止 / 全部停止
  • Agent 工具 6 件套:ssh_list 列主机、ssh_exec 跑命令、ssh_upload / ssh_download 传文件、ssh_tunnel 管隧道、ssh_cluster 集群执行;GUI 与 Agent 共用 SshEngine 单例

技术实现

  • 语言: TypeScript(host 半区 Node.js + client 半区 React/浏览器 bundle)
  • 关键依赖: ssh2(ssh2 客户端,支持 exec / shell / SFTP / forwardOut / MaxSessions 兼容)、ws(WebSocket Server,用于 /api/dsh-ssh/terminal 升级)、@xterm/xterm + @xterm/addon-fit(浏览器侧终端渲染)、schemastery(插件配置 Schema 校验)
  • 架构模式: 双半区 cordis 插件 + profile bundle patch:dsh.bundle.patch(cordis.patch.yml)以插件名 @deepseek-ai/dsh-ssh 把行插入 web profile roster,host 半区(exports ".")注册 SshEngine + /api/dsh-ssh 路由 + WebSocket 终端 + Agent 工具 + system-prompt 宣告,client 半区(exports "./client")通过 DOM 注入在侧边栏新增「SSH」入口并挂载中心面板的 hosts / terminal / transfer / tunnels / cluster 五个 tab;不修改 DSH 源码
  • 入口文件: host 端 packages/dsh-ssh/src/index.ts、client 端 packages/dsh-ssh/src/client/index.ts、profile 补丁 packages/dsh-ssh/cordis.patch.yml

适用场景

适合需要在自己的开发服务器、内网机器或云上节点手动跑运维操作(跑命令、传文件、开隧道)的 DSH 用户:直接在网页侧边栏点开 SSH 入口就能配置多台主机、打开 Web 终端维护服务、用 SFTP 部署产物。同时希望让 AI 也参与远程运维时,模型可调用 ssh_list / ssh_exec / ssh_upload / ssh_download / ssh_tunnel / ssh_cluster,把 GUI 配好的主机当作 AI 的远程手足。

前置依赖与兼容性

依赖最低版本说明
DSH(peerDependencies)^0.1.0-rc.6需 host/client 同系列 SDK:dsh-host-webserver / dh-tools / dsh-system-prompt / dsh-settings / dsh-client-runtime / dsh-client-connection / dsh-client-locale / dsh-client-ui-settings / dsh-client-ui-sidebar / dsh-client-ui-slots
Node.js^22.19.0 或 >=24.0.0packages/dsh-ssh/package.json#engines
客户端平台macOS / Windows / Linux客户端为浏览器(Web GUI),跨平台
远程主机SSH 服务 + SFTP subsystem客户端与远程主机走 ssh2 协议,无 POSIX / Windows 限制
原生模块ssh2(含 cpu-features)pnpm 10+ 默认阻止构建脚本,需在 <profile>/pnpm-workspace.yaml 的 allowBuilds 中把 ssh2 与 cpu-features 设为 true 后重装(仓库 README §安装说明)

安装方式

dsh plugin --profile web add github:chenw2759-wq/dsh-IDE/packages/dsh-ssh

配置项

配置类型说明默认值
enabled布尔总开关:关闭后不再注册路由、Agent 工具与提示词宣告true
announceToAgent布尔是否向模型系统提示词中注入一段说明(声明 dsh-ssh 的能力范围与限制),关闭后 Agent 看不到这段说明true

主机配置(别名 / 主机 / 端口 / 用户名 / 密码或密钥路径 / ProxyJump 链 / 标签 / 备注)独立存放在 ~/.dsh/dsh-ssh.json(文件权限 0600、目录 0700),通过 SSH 面板的「主机」页或「从 ~/.ssh/config 导入」按钮维护,详见 src/store.ts。

常见问题

Q: 这个插件和官方 dsh-ssh 是什么关系?

A: 这就是官方收录的条目。dsh-ssh 由 chenw2759-wq/dsh-IDE 仓库发布,负责 DSH 上的「手动 SSH 运维」(管理主机、Web 终端、SFTP、隧道、集群);同一仓库下的 dsh-easyssh 在其之上加了「工作区模式切换」,让模型日常的 read/write/edit/bash 工具在 SSH 模式下透明作用于远程。两个插件共享 ~/.dsh/dsh-ssh.json。

Q: 安装后需要额外配置吗?

A: 无需改文件。插件自带 cordis.patch.yml(声明在 package.json#dsh.bundle.patch),会以 profile bundle layer 形式自动应用,插入 id 为 ssh 的双半区插件行;设置面板里有 enabled 与 announceToAgent 两个开关可调。

Q: Agent 调用前必须先在 GUI 配主机吗?

A: 是。ssh_exec 等 6 个 Agent 工具共用同一份主机配置(~/.dsh/dsh-ssh.json);首次使用需在 SSH 面板的「主机」页手动加,也可以从 ~/.ssh/config 一键导入(已存在的别名会自动跳过)。

Q: 配置文件存在哪里?是否加密?

A: 存于 ~/.dsh/dsh-ssh.json,文件权限 0600、目录 0700(store.ts 写入时显式 mode: 0o600)。密码与密钥口令以明文保存,文档明确说明这是「与 ssh-skill 在 ssh-config 注释里写密码同一信任模型」——按本地凭据对待,不要把该文件上传到云端或共享给他人。

Q: 支持跳板机(ProxyJump)吗?

A: 支持多级。链中的每一跳必须是本插件已配置的主机别名(store.find 必须能找到),按顺序通过 hopClient.forwardOut 转发到下一跳的 127.0.0.1:0,最终落到目标主机。

Q: Web 终端走的是什么协议?

A: xterm.js + 真实 RFC 6455 WebSocket。浏览器发起到 /api/dsh-ssh/terminal?alias=...&cols=...&rows=... 的 WebSocket 升级请求,host 端用 ws 做 noServer 升级并调 ssh2 的 client.shell({ term: 'xterm-256color', ... });缓冲背压 1MB 暂停 shell 输出、512KB 恢复,保证慢客户端不丢消息。

Q: 上传 / 下载路径有什么限制?

A: 上传的目标路径必须是绝对路径(相对路径会被 remotePath must be an absolute path 拒绝);下载暂不支持整个目录(仅单文件,逐文件下载),上传支持目录递归(走本地 walk 逐文件传);临时暂存在 os.tmpdir()/dsh-ssh-uploads/,传输完成后清理。

Q: 网络断线会怎样?命令会重复执行吗?

A: SshEngine.withClient 每个操作默认最多重试 3 次;exec 断线重连可能重复执行非幂等命令(重启服务类),长命令需注意副作用;SFTP 通道按 client 缓存复用,避免撞 OpenSSH MaxSessions(默认 10)导致后续列表 / 读取间歇失败;ls / stat / readFile 带 15s / 60s 超时,半死连接会报错而不是无限转圈。

上手难度

入门 — 安装一行命令后侧边栏自动出现「SSH」入口,主机可手动填或一键从 ~/.ssh/config 导入;Web 终端、SFTP、隧道都是 GUI 操作;Agent 工具对模型自动声明,无需用户记忆 API。

已知问题与限制

  • 断线自动重连最多 3 次:exec 通道可能重复执行非幂等命令(重启服务、删除文件等),长命令需注意副作用(engine.ts:249 withClient(attempts = 3))
  • 上传必须绝对路径:相对路径会被拒绝;下载不支持整个目录(仅单文件),上传支持目录递归(README §已知限制 + engine.ts:591)
  • 跳板机每一跳必须是本插件已配置的主机别名:否则报 proxyJump alias 'X' not found,且不支持外部 ssh_config 主机(engine.ts:293)
  • 远程命令输出原样返回:包括 env / cat ~/.aws/credentials 等可能带回敏感信息的内容,远程输出不脱敏(README §安全模型)
  • ssh_upload / ssh_download 以宿主进程权限直接读写本机任意路径:不经本机沙箱(与 ssh-skill 相同语义,README §安全模型),Agent 调用前需确认路径可信
  • 密码与密钥口令以明文存于 ~/.dsh/dsh-ssh.json:文件权限 0600 / 目录 0700,但仍是本地凭据,不要同步到云端(store.ts:334 + README §安全模型)
  • 断点续传(resume)未实现:上传 / 下载中断后必须重传(README §已知限制)
  • pnpm 10+ 默认阻止 ssh2 / cpu-features 构建脚本:安装后会在 <profile>/pnpm-workspace.yaml 自动写入占位,需把 allowBuilds.ssh2 与 allowBuilds.cpu-features 改为 true 再重新 dsh plugin add(父仓库 README §安装)
  • SFTP 操作受 OpenSSH MaxSessions(默认 10)约束:本插件按 client 缓存复用 SFTP 通道缓解,撞上限时列表 / 读取会间歇失败(engine.ts:201-208)
  • WebSocket 终端背压阈值固定 1MB / 512KB:极端慢客户端可能短暂卡顿,未提供自定义(routes.ts:36-39)
  • 配置 JSON 上限 64KB:/api/dsh-ssh/hosts 的 JSON 请求体上限 MAX_JSON_BODY_BYTES = 64 * 1024(routes.ts:23),超大主机列表会 400
  • 上传 body 上限 4GB:/api/dsh-ssh/upload 的 MAX_UPLOAD_BYTES = 4GB(routes.ts:26),更大文件需分片
  • 主机别名语法限制:仅允许小写字母、数字与单连字符(/^[a-z0-9]+(-[a-z0-9]+)*$/),含下划线或大写的别名会被 store 拒绝(store.ts:62)
  • alias 命名区分大小写:内部存储按字符串精确匹配(file.hosts.some(entry => entry.alias === alias)),需保持一致(store.ts:134)

Read the usage guide →

Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.

Listing badge

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/chenw2759-wq/dsh-IDE/packages/dsh-ssh)

Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.

← Back to plugin directory