DSH 插件:用密码直连远程主机的 SSH 终端。一个自然语言工具connect / exec / close /…
30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add framecy/dsh-ssh-shell该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 24 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-ssh-shell(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/13 14:49:29
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 21 处,展示前 16 条)
- 执行外部命令来自配置/变量lib/index.js:216
const probe = spawnSync(candidate, ["-V"], { stdio: "ignore", timeout: 5000 }) - 写入本地文件lib/index.js:339
mkdirSync(dir, { recursive: true, mode: 0o700 }) - 执行外部命令固定命令lib/index.js:361
const result = spawnSync("ssh", args, { - 读取本地文件lib/index.js:382
try { hasSocket = existsSync(session.controlPath) } catch { hasSocket = false } - 执行外部命令固定命令lib/index.js:384
const r = spawnSync( - 发起网络请求lib/index.js:427
const outcome = await approval.request({ - 读取本地文件lib/index.js:447
try { if (existsSync(controlPath)) return true } catch {} - 读取本地文件lib/index.js:450
return existsSync(controlPath) - 执行外部命令来自配置/变量lib/index.js:475
const started = spawnSync(SSHPASS_BIN, masterArgs, { - 执行外部命令固定命令lib/index.js:499
try { spawnSync("ssh", baseSshArgs(target, controlPath).concat(["-O", "exit"]), { encoding: "utf8", timeout: 5000 }) } catch {} - 读取本地文件lib/index.js:500
throw new Error("ssh connect failed for " + target.key + " (probe): " + (probe.stderr || probe.stdout || probe.error) + " | socket=" + controlPath + " - 读取本地文件lib/index.js:774
if (!existsSync(src)) { - 读取本地文件lib/index.js:778
const body = readFileSync(src, "utf8") - 写入本地文件lib/index.js:784
mkdirSync(dir, { recursive: true }) - 写入本地文件lib/index.js:785
writeFileSync(dest, body, "utf8") - 执行外部命令固定命令lib/index.js:1169
const proc = spawn("ssh", sshArgs, { stdio: ["ignore", "pipe", "pipe"] })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 密码直连远程主机
- 浏览器终端面板
DSH 插件:用密码 SSH 登录远程主机——在持久 ControlMaster 会话之上提供自然语言工具,外加浏览器终端面板,通过 WebSocket 接入真实 PTY。
README
由 DeepSeek 最新模型翻译生成dsh-ssh-shell
DSH 插件:用密码直连远程主机的 SSH 终端。一个自然语言工具(connect / exec / close / status)+ 浏览器右侧浮动终端面板,底层是 OpenSSH ControlMaster 常驻会话 + sshpass + node-pty 起的真实 PTY,经 WebSocket 桥到浏览器。
核心目标:不再频繁断连,断了能自己回来。
能力
- SSH 工具(对话里用):ssh_remote 一次建立连接,之后每次远程命令都先向用户确认;terminal_send / terminal_read 直接操作面板里那个活的终端,不逐条确认。
- 浏览器终端面板:右侧浮动面板,真实 PTY —— 原始终端模式、方向键、全屏程序、Ctrl+C / Ctrl+D / Tab 补全都正常。
展开完整文档(README 剩余 1 节)
dsh-ssh-shell DSH 插件:用密码直连远程主机的 SSH 终端。一个自然语言工具(connect / exec / close / status)+ 浏览器右侧浮动终端面板,底层是 OpenSSH ControlMaster 常驻会话 + sshpass + node-pty 起的真实 PTY,经 WebSocket 桥到浏览器。 核心目标:不再频繁断连,断了能自己回来。 能力 - SSH 工具(对话里用):ssh_remote 一次建立连接,之后每次远程命令都先向用户确认;terminal_send / terminal_read 直接操作面板里那个活的终端,不逐条确认。 - 浏览器终端面板:右侧浮动面板,真实 PTY —— 原始终端模式、方向键、全屏程序、Ctrl+C / Ctrl+D / Tab 补全都正常。 - 断连自愈: - ControlMaster + ControlPersist=yes —— master 常驻,不闲置回收; - SSH 双保活:ServerAliveInterval=30 + TCPKeepAlive=yes,抗 NAT / 防火墙 / sshd 掐断静默连接; - WebSocket 空闲看门狗:25s 一次 ping,60s 无响应即断开这个客户端(不动 pty); - pty 意外退出而 master 还活着时原地重建,订阅者自动迁移(最多 3 次); - 前端自动重连:最多 3 次,每次间隔 10 秒;可手动「停止重连」,用尽后自动停下并说明原因。凭据存当前标签页。 - 面板隐藏不断线:折叠面板只切 display:none,socket 和 pty 都活着,展开即续。 安装 前置条件:已经装好 DSH(DeepSeek Harness),并且有一个能跑的 profile(下面以 web 为例)。 1. 把插件放进 profile 的 plugins/ 目录 目录本身可以是软链接,DSH 会顺着链接加载(开发时推荐,改代码即生效): git clone https://github.com/framecy/dsh-ssh-shell.git ln -s "$PWD/dsh-ssh-shell" ~/.dsh/profiles/web/plugins/dsh-ssh-shell 2. 在 profile 的 cordis.patch.yml 里挂上插件行 编辑 ~/.dsh/profiles/web/cordis.patch.yml,加入: - insert: - id: ssh-shell name: './plugins/dsh-ssh-shell/lib/index.js' 3. 重启 DSH 插件只在进程启动时加载,改完必须重启: 停掉当前的 dsh 进程(Ctrl+C,或 kill 掉对应 pid),然后重新启动 dsh web 重启后浏览器刷新页面(前端 client.js 是页面加载时取的)。 装好后,右侧边缘会出现「终端」竖条,点它即可打开面板(唯一入口)。 前置依赖 | 依赖 | 说明 | | ssh / scp | OpenSSH 客户端,提供 ControlMaster | | sshpass | 非交互密码认证。brew install sshpass(需要 keepalive tap)或 brew install esolv/sshpass/sshpass | | node-pty | 后端起 PTY 用,DSH 运行环境自带 | 缺 sshpass 会报硬错(可用 requireSshpass: false 降级为警告)。 配置 cordis.patch.yml 提供这些配置项(由插件自身的 bundle patch 声明,profile 级 cordis.patch.yml 可按 id 覆盖): | 配置 | 默认 | 说明 | | controlDir | "" → ~/.dsh/ssh-shell | ControlMaster socket 存放位置 | | timeoutMs | 30000 | 单条命令默认超时 | | controlPersistSeconds | "" → yes | 留空 = master 常驻直到自己死;填秒数 = 闲置这么久后回收 | | confirmByDefault | true | 远程命令是否默认逐条确认 | | requireSshpass | true | 缺 sshpass 是否直接报错 | 桌面版(DeepSeek Harness.app):桌面版把页面加载在自有协议 dsh-app://app/ 下,该 origin 下 location.host 是 "app"、无法用作 WebSocket 主机名。插件对此自动回落到本地 Host 127.0.0.1:19387(桌面版固定端口)。若你的桌面版改了端口,在页面里设置 window.__DSH_SSH_SHELL_WS_HOST__ = "127.0.0.1:<port>" 即可覆盖。 用法 对话里(工具) ssh root@1.2.3.4 -p 22,密码 xxx,连上后看一下 /var/log 里最近的报错 第一次连接不确认;之后每条远程命令都会把确切命令写出来让你确认。长时间任务传 run_in_background: true,用 job_output 增量读。 面板(GUI) 点右侧边缘的「终端」竖条(唯一的入口)。填 root@1.2.3.4 -p 22 + 密码,连接。 - 面板是个浮动窗口:拖标题栏移动位置,拖四条边或四个角调整大小(最小 340×240,不会超出可视区域,也拖不到屏幕外); - 尺寸和位置记在当前标签页,刷新后还在;窗口变小时面板会被拉回可视区域内; - 拖动结束即把新的行列数同步给远端 PTY,全屏程序(vim / top / htop)跟着变; - 最小化面板不会断开 SSH; - 断线会自动重连,最多 3 次、每次间隔 10 秒,进度写在面板上; - 重连过程中可随时点标题栏的「停止重连」取消;3 次用尽后会自动停下并说明原因,不会无限重试,需要时点「重连」再试;只有「断开」按钮和 master 真的死了,会话才会结束。 凭据只存在当前标签页(sessionStorage),关掉标签页即清除,不会写到磁盘。 设计取舍 pty 归属于 target(user@host:port),不归属任何单个 WebSocket。理由: - 面板折叠、页面刷新、切 tab、网络抖动都不该杀掉远端 shell; - 只有显式 type:"close" 或 master 死亡才真正结束; - master 活着时,浏览器永远不需要重新输密码。 测试 npm install # 首次:装测试用的三个依赖 npm test # 等价于 node tests/run_all.mjs 不需要真实 sshd,也不需要网络。测试用假的 ssh / sshpass / node-pty 替换进程边界,让插件的真实逻辑照常运行(目标解析、脚本拼装、工作目录探测、pty 生命周期、WebSocket 扇出、几何钳位)。 | 文件 | 覆盖 | 断言数 | | tests/core_test.mjs | target 解析、shell 引号转义、cwd 探针封帧与提取、ANSI 清洗、ControlPersist 取值、socket 路径长度约束 | 47 | | tests/terminal_test.mjs | 路由注册、未连接时的输入容错、连接失败回报、pty 扇出与重挂载、订阅者隔离 | 19 | | tests/client_test.mjs | 前端可加载性(CJS shim 回归)、槽位注册、store 订阅契约、几何钳位与持久化 | 39 | SSH 保活选项已用 ssh -G 验证,确认 OpenSSH 接受。 运行时不需要 npm install:@deepseek-ai/dsh-tools、ws、node-pty 都由 DSH 安装自带,插件由 DSH 加载器解析这些依赖。devDependencies 只是为了让 npm test 能独立跑起来。 版本 见 CHANGELOG.md。当前 0.5.0。 License Apache-2.0 © 2026 framecy
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
framecy/dsh-ssh-shell
DSH 插件:用密码直连远程主机的 SSH 终端。一个自然语言工具connect / exec / close /…
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目