DSH 插件:多机 SSH 工作台。主机库、按项目授权、右侧栏里的终端与双栏 SFTP。模型用 SSHManager…
37.5/100
综合分
8
GitHub 星标
278
npm 周下载
—/5
用户评分
数据截至 2026/10/29 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-ssh-tunnelnpm 源 · dsh-ssh-tunnel 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 3 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-ssh-tunnel @ 1.1.0
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 14:39:46
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 36 处,展示前 23 条)
- 读取本地文件lib/index.js:102
const st = lstatSync(abs) - 删除本地文件lib/index.js:104
unlinkSync(abs) - 读取本地文件lib/index.js:108
for (const name of readdirSync(abs)) { - 删除本地文件lib/index.js:111
rmdirSync(abs) - 删除本地文件lib/index.js:114
unlinkSync(abs) - 写入本地文件lib/index.js:118
mkdirSync(DATA_DIR, { recursive: true }) - 写入本地文件lib/index.js:119
try { chmodSync(DATA_DIR, 0o700) } catch {} - 读取本地文件lib/index.js:269
if (!existsSync(cfgPath)) continue - 读取本地文件lib/index.js:271
try { text = readFileSync(cfgPath, 'utf8') } catch { continue } - 读取本地文件lib/index.js:302
if (!existsSync(dir)) continue - 读取本地文件lib/index.js:304
for (const name of readdirSync(dir)) { - 写入本地文件lib/index.js:1183
mkdirSync(dirname(local), { recursive: true }) - 写入本地文件lib/index.js:1248
mkdirSync(abs, { recursive: true }) - 写入本地文件lib/index.js:1262
renameSync(from, to) - 写入本地文件lib/index.js:1288
writeFileSync(marker, String(Date.now()) + '\n', { mode: 0o600 }) - 读取本地文件lib/shared/path.js:136
const st = lstatSync(abs) - 删除本地文件lib/shared/session-auth.js:42
unlinkSync(localPath) - 读取本地文件lib/shared/persist.js:8
if (!existsSync(path)) return fallback - 读取本地文件lib/shared/persist.js:11
raw = readFileSync(path, 'utf8') - 写入本地文件lib/shared/persist.js:24
writeFileSync(tmp, JSON.stringify(data, null, 2) + '\n', { mode }) - 写入本地文件lib/shared/persist.js:25
try { chmodSync(tmp, mode) } catch {} - 写入本地文件lib/shared/persist.js:26
renameSync(tmp, path) - 写入本地文件lib/shared/persist.js:27
try { chmodSync(path, mode) } catch {}
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-ui-sidebar-right给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 主机库管理
- 按项目授权
- 侧栏终端与双栏SFTP
展开完整介绍(91 字)↓
DSH 插件:多机 SSH 工作台。主机库、按项目授权、右侧栏里的终端与双栏 SFTP。模型用 SSHManager 工具执行命令、传文件;你在侧栏管主机与授权。密钥不进模型上下文。
最近更新
在 GitHub 查看全部 →v1.2.12026-10-28
· 修复
· DSH 0.2.x 的 web 配置档下,插件 API 的所有请求都返回 403。宿主从 0.2.x 起不再提供 webRuntime 服务,插件读取信任列表时拿到的结果始终为空,于是 dsh web --host 的访问全被 Host 头检查拦下(#7)。现在信任判定改成三层链条:web 配置档的 connection 服务在线时,以它的 requestRejection() 为最终裁决(宿主自身的 Host/Origin 围栏加浏览器会话认证,不带 Cookie 的裸 API 调用会得到 401 而非 403);该服务缺席时,退回 webStartup 的启动参数(--trusted-host 列表加上具体的 --host 绑定地址,通配绑定地址永远不会被列入);两者都没有时,维持仅回环。桌面版行为不变。
v1.2.02026-10-23
· 修复
· SFTP 双栏的「上级」在 POSIX 上拼出畸形路径。 客户端 parentOf() 用 splitPath() 切分后重新 join("/"),前导 / 在切分时被 filter(Boolean) 丢掉且从未补回,于是 /srv/app/log 的上级返回相对路径 srv/app;宿主侧 constrainToWorkspace() 把相对路径按工作区根解析(join(root, "srv/app")),实际去扫 /srv/app 并报 cannot list: ENOENT ... scandir '/srv/app'。除 / 本身外,Linux 上本地面板的每一次「上级」都会失败,远端栏只要深于一级也同样会——两侧共用同一个 parentOf();Windows 只在本地栏因盘符分支返回绝对路径而掩盖了该缺陷。现在 POSIX 分支补回前导斜杠,C: 盘符与相对路径的既有行为保持不变。
· 「上级」在本地面板越过工作区根时直接报错。 位于工作区根目录时按钮仍可点击,请求被路径守卫拒绝后以红字显示 local path must be under ...(Windows 盘符根分支的现象)。现在本地栏判断当前目录与 projectPathKey:已到根即禁用按钮并在悬停时给出本地提示,未绑定项目时维持放行;远端栏以 / 为下限,到顶时给出远端提示。比较使用 root + "/" 前缀,2 这类名字相近的同级目录不会被误判为子目录;大小写折叠覆盖 C:\ 盘符与 UNC 共享路径(//server/share),POSIX 路径仍区分大小写。
· 新增回归用例覆盖客户端路径助手。 lib/client.js 是自包含 bundle,助手函数在闭包内,自检按源码切片求值:parentOf 的 POSIX/Windows 分支、canGoUp 的根边界与大小写折叠(含 UNC 共享路径),以及 zh/en 两份词典的键集对称;另有一条切片断言把「upDisabled 来自 canGoUp、disabled/title 消费它、提示挂在容器上」锁住。
· Windows 上会话浮层盖住原生窗口按钮所在的顶栏。 终端 / SFTP 浮层是 position:fixed;inset:0 的视口级浮层,遮罩与模糊把宿主为最小化 / 最大化 / 关闭预留的标题栏带连同宿主自己的顶栏一起盖住;窗口不高时原生按钮还压住面板右上角,面板自己的「关闭」被挤在正下方。现在浮层的上边界取自宿主自己的弹窗遮罩所用的同一个变量(inset:var(--dsh-frame-chrome-top, 0px) 0 0):Windows 上整条顶栏留在遮罩之外,全屏时该变量为 0px,浮层照旧铺满视口。
· Fixed
· The SFTP "up" button built a malformed POSIX path in both panes. The client parentOf() split the path with splitPath() and rejoined with "/", but the leading / was dropped by filter(Boolean) and never restored, so the parent of /srv/app/log came back as the relative srv/app; the host's constrainToWorkspace() resolves relative paths against the workspace root (join(root, "srv/app")), scanning /srv/app and failing with cannot list: ENOENT ... scandir '/srv/app'. On Linux every "up" failed except from / itself in the local pane, and the remote pane failed once below its first level — both panes share the same parentOf(); on Windows only the local pane hid the defect, because the drive-prefix branch returns an absolute path. The POSIX branch now restores the leading slash, leaving the C: drive and relative-path behav
v1.1.02026-10-18
· 变更
· 客户端面板改挂 DSH 官方右侧栏。 标签页类型经 sidebarRightTabs.register 注册,正文与标题分别占用官方槽位 sidebar.right.pane.tab 与 sidebar.right.pane.tab.title;引导页入口框由 guide 条目渲染(order 44)。注册不再经由第三方侧栏宿主插件:dsh-better-sidebar 的 peer、dsh.client.inject 条目与 keywords 一并移除。
· 客户端不再传项目 cwd 提示。 getProjectContext 只带 sessionId,项目路径由宿主从会话头(ctx.sessions.get(sessionId).header.cwd)解析;随之删除宿主注入的 scope.sessionId / scope.cwd 等字段,会话 id 改取官方席位平铺注入的 sessionId。
· DSH 兼容下限抬到 0.2.0-rc.2。 engines.dsh 与 @deepseek-ai/dsh-client-locale peer 收敛为单段 >=0.2.0-rc.2 =0.2.0-rc.2 <0.3.0-0, and a new @deepseek-ai/dsh-client-ui-sidebar-right peer declares the same range.
· The official right-sidebar tab is not resident by default. Users open the panel from the "+" guide page in the tab strip; layout persists per session, so each new session needs one open.
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成DSH SSH Tunnel
DeepSeek Harness 的多机 SSH 工作台:主机库、按项目授权、右侧栏里的终端与双栏 SFTP。
模型用 SSHManager 工具执行命令、传文件;你在侧栏管主机与授权。密钥不进模型上下文。
这是什么 • 核心特性 • 效果 • 安装方式 • 侧栏 • 模型工具 • 安全 • 开发 • 许可证与作者
这是什么
DSH SSH Tunnel 是 DeepSeek Harness 的社区插件,挂在 DSH 官方右侧栏的标签页上:把多台 SSH 主机收进一个主机库,按项目授权,然后在中央面板里开交互式终端(xterm)或双栏 SFTP。
它不会把全局 fs / subprocess 换成一个远程盘:远端操作只发生在你显式调用的 SSHManager 工具与面板里,本地文件与远端文件始终是两侧分明的东西。
配套插件是 dsh-git-forge(Git 凭据与 push 策略)。
参考来源
产品形态与部分 UX 参考开源项目 LiveAgent(多机 SSH 主机库、按项目授权、侧栏隧道管理、中央终端 / SFTP 等)。
展开完整文档(README 剩余 1 节)
DSH SSH Tunnel DeepSeek Harness 的多机 SSH 工作台:主机库、按项目授权、右侧栏里的终端与双栏 SFTP。 模型用 SSHManager 工具执行命令、传文件;你在侧栏管主机与授权。密钥不进模型上下文。 这是什么 • 核心特性 • 效果 • 安装方式 • 侧栏 • 模型工具 • 安全 • 开发 • 许可证与作者 这是什么 DSH SSH Tunnel 是 DeepSeek Harness 的社区插件,挂在 DSH 官方右侧栏的标签页上:把多台 SSH 主机收进一个主机库,按项目授权,然后在中央面板里开交互式终端(xterm)或双栏 SFTP。 它不会把全局 fs / subprocess 换成一个远程盘:远端操作只发生在你显式调用的 SSHManager 工具与面板里,本地文件与远端文件始终是两侧分明的东西。 配套插件是 dsh-git-forge(Git 凭据与 push 策略)。 参考来源 产品形态与部分 UX 参考开源项目 LiveAgent(多机 SSH 主机库、按项目授权、侧栏隧道管理、中央终端 / SFTP 等)。 核心特性 | 特性 | 说明 | | 主机库 | 主机增删改、支持导入 OpenSSH 配置;密码 / 私钥(含口令),密钥只存宿主侧 | | 按项目授权 | 授权 key 是 DSH 会话工作区(projectPathKey);连接前必须先授权,Connect 不会自动写入授权 | | SSHManager 工具 | 远端 exec、SFTP 列举/读写/增删改、上传下载、交互式会话读写;reuse_or_create / new / require_existing 会话策略 | | 中央面板 | 交互式终端(xterm)与双栏 SFTP:左侧是项目工作区、右侧是远端,可直接上传下载 | | 断线可续 | 掉线会话留作墓碑,可重连(同一 id)或关闭;意外断开自动重连最多 3 次,ssh2 keepalive 30s × 3 | | 主机密钥指纹 | 以 SHA256 hex 存入 known_hosts.json,首次连接或指纹变更时在侧栏确认并展示指纹 | | 本地路径守卫 | 上传 / 下载 / 列举 / 删除的本机路径限制在项目工作区根内,词法 与 realpath 双重校验 | | 界面双语 | 侧栏与面板随 DSH 界面语言在中文 / 英文间即时切换 | 效果 中央面板:终端与双栏 SFTP —— 左侧项目工作区、右侧远端,可跨栏拖拽传输右侧栏:主机库、按项目授权与隧道会话 安装方式 从 npm 安装 先停掉正在运行的 DSH(运行中的服务会锁住依赖,装完再起) dsh plugin --profile <profile> add "dsh-ssh-tunnel" 提示:装好后刷新一下浏览器页面,「SSH 隧道」入口才会出现在右侧栏——只重启宿主不够,客户端产物是页面加载时取的。 装完怎么用 1. 打开右侧栏「SSH 隧道」→ 主机库 添加一台主机(密码或私钥) 2. 切到 项目授权,给当前项目勾上这台主机并保存(不授权连不上,这是有意为之) 3. 回 隧道会话 点 Connect;首次连接会提示确认主机密钥指纹 4. 点 终端 得到一个交互式 shell,或点 SFTP 打开双栏面板 5. 让模型用 SSHManager action=exec 跑条命令、用 sftp_list 看目录、sftp_upload / sftp_download 传文件,验证整条链路 侧栏 侧栏只有一个 Tab,内部三页: | 页面 | 作用 | | 项目授权 | 当前项目允许使用的主机 | | 主机库 | 主机增删改、OpenSSH 配置扫描导入 | | 隧道会话 | 连接 / 断开,打开终端或 SFTP;掉线会话留墓碑,可重连或关闭 | 模型工具 SSHManager 的动作按用途分组: | 动作 | 作用 | | list_hosts / list_sessions | 列出主机库、列出当前会话 | | create_session / close_session | 建立或关闭会话(配合 session_strategy) | | exec | 远端执行命令(command、cwd、timeout_ms) | | sftp_list / sftp_stat / sftp_read_text / sftp_write_text | 远端目录、元数据与文本读写 | | sftp_mkdir / sftp_rename / sftp_delete | 远端建目录、重命名、删除 | | sftp_upload / sftp_download | 在项目工作区与远端之间传文件 | | read_session / send_input / resize_session | 交互式会话的读取、输入与窗口尺寸 | - 会话策略:reuse_or_create(默认,会复活同主机已断开的会话)、new、require_existing,或显式传 session_id - 超时:默认 exec 30s、SFTP 元数据 30s、SFTP 传输 120s、shell 类操作(read_session / send_input / resize_session)10s;timeout_ms 可覆盖,取值钳制在 1000–300000,整次调用另有 300s 上限 - max_bytes:exec 与 sftp_read_text 的单次输出上限,按字节钳制在 1024–1048576(默认 exec 262144 即 256 KiB、sftp_read_text 524288 即 512 KiB);达到上限时结果带 truncated: true 且只含前 max_bytes 字节 - exec 结算:结果带 exitKnown / code / signal / connectionDropped——正常退出 exitKnown: true 且 code 为退出码;按信号终止时返回 signal;连接被切断时 code 为 null 且 connectionDropped: true - 交互式输出的读取走 seq 游标协议(侧栏轮询的 shellRead):客户端携带上次读到的 since,响应返回 chunk / since / seq / baseSeq / dropped / chunkTruncated;环形缓冲(512 KiB)淘汰后 baseSeq 前移且 dropped: true,客户端据此全量重取;单次响应的 chunk 上限 256 KiB - 认证方式只有密码或私钥;键盘交互式认证(含堡垒机网页 MFA)不支持 安全 信任边界(客观陈述):插件的 HTTP API 挂在 DSH 宿主的 web 服务上,信任判定按宿主组成分三层:web profile 下优先由宿主 connection 服务裁决(宿主自身的 Host/Origin 围栏 + 浏览器会话认证);该服务缺席时按 webStartup 的启动参数自管校验(--trusted-host 列表与具体的 --host 绑定地址,并校验浏览器 Origin);两者都没有时只接受本机回环(localhost / 127.0.0.1 / ::1)。插件 API 自身没有鉴权 token——在桌面版等无 connection 服务的组成里,能在本机访问该端口的进程都被视为已授权用户,可以使用本插件的能力。会话 API 必须带 projectPathKey,跨项目不可见。 授权与路径守卫动作清单: - 连接必须先授权:未在「项目授权」里勾选的主机无法建立连接,Connect 不会自动写入授权 - 授权撤销即时生效:写类操作在发起前与结果回报前各复检一次授权;撤销后输出被丢弃并以 not authorized 失败,下载中的本地文件被删除,受影响的存活会话被关闭,重连拒绝复活已撤销主机 - 本地路径守卫 fail-closed:上传 / 下载 / 列举 / 建目录 / 删除 / 重命名的本机路径限制在项目工作区根内,词法与 realpath 双重校验,越界路径与指向工作区外的符号链接一律拒绝;工作区根取不到时直接拒绝操作(可用环境变量 DSH_SSH_TUNNEL_WORKSPACE_ROOT 显式指定) - 工具结果与列表 API 不返回 password / PEM / 口令 - 主机密钥以 SHA256 hex 存入 known_hosts.json;首次连接或指纹变更时在侧栏确认(展示指纹) - 优先使用密钥登录;若 secrets.json 可能泄露请立即轮换凭据 - 认证方式为密码或私钥 数据放在哪 $DSH_HOME/ssh-tunnel/(目录权限 0700;此为 POSIX 系统行为——Windows 的 NTFS 权限由继承 ACL 决定,chmod 不改 DACL): | 文件 | 内容 | 权限(POSIX) | | hosts.json | 主机元数据(不含密钥明文) | 0600 | | secrets.json | 密码 / PEM / 口令 | 0600 | | grants.json | projectPathKey → hostIds[] | 0600 | | known_hosts.json | 已信任的主机密钥指纹 | 0600 | 开发 npm test # 自检脚本全量回归(实际执行 node scripts/smoke-test.mjs) npm run check # 语法检查 + 自检 node scripts/smoke-test.mjs # 直接运行自检(离线设计,不起 SSH、不起 DSH 进程) bash scripts/sync-to-dsh.sh --dry-run # 预览 link: 接入命令;去掉 --dry-run 才会改写 profile node scripts/portal-probe.mjs # 客户端 Tab 渲染探针(能解析到 react 时生效,否则明确跳过) 项目目录: lib/index.js 宿主入口:工具注册、/dsh-ssh-tunnel/api 路由、授权与路径守卫、xterm 资产下发 lib/client.js 客户端 bundle(已入库;dsh plugin add 不做构建) lib/session.js 会话生命周期:连接、keepalive、掉线墓碑与自动重连、exec/SFTP 执行 lib/shared/ 宿主与客户端共用纯函数:path / args / host-key / host-summary / http-trust / persist / session-auth / session-policy / shell-buffer / vendor scripts/ install.sh · install.ps1 · sync-to-dsh.sh · smoke-test.mjs · portal-probe.mjs scripts/lib/ 安装链共享逻辑(.cjs,install.sh 与 install.ps1 共用) cordis.patch.yml 包内 bundle patch,CLI 据此写入 dsh.profile.bundles xterm 加载 @xterm/xterm@5.5.0 与 @xterm/addon-fit@0.11.0 是钉死的运行时依赖。宿主把它们的 UMD 与 CSS 从同源白名单路由下发(/dsh-ssh-tunnel/vendor/xterm.js|addon-fit.js|xterm.css),客户端用普通 / 加载。没有 CDN 回退,也不依赖模块表。 支持与致谢 - 如果这个插件对你有帮助,欢迎点亮 Star;有问题或建议请提 Issue 或 Pull Request。 - 变更记录见 CHANGELOG。 - LiveAgent(thirsty5034/LiveAgent):产品形态与部分 UX 的参考来源(见上文「参考来源」) - DeepSeek Harness:插件、工具与 agent shell 的宿主 许可证与作者 MIT。授权条款与版权归属以 LICENSE 为准;上游项目与代码作者 @thirsty5034。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
OMSociety/dsh-ssh-tunnel
DSH 插件:多机 SSH 工作台。主机库、按项目授权、右侧栏里的终端与双栏 SFTP。模型用 SSHManager…
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 266,913已汉化DSH
71.8
多设备 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,848已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,171已汉化DSH
70.4