jumpserver-east/jumpserver-dsh
DeepSeek Harness插件:管理JumpServer资产并通过KoKo对其进行操作
项目介绍Project Overview
这是 JumpServer 的 DSH 插件,让 agent 通过 Core API 管理授权资产,并经 KoKo 堡垒对 SSH/SFTP 主机执行命令、读写文件,或连接 MySQL、PostgreSQL、Redis 等数据库。适合需要保留命令过滤、ACL 和会话审计、不直连资产 IP 的运维场景。注意不支持 RDP;数据库默认仅查询,写操作需显式开启。
This DSH plugin integrates JumpServer, letting agents manage authorized assets through the Core API and access SSH/SFTP hosts or databases via KoKo, without direct asset IP connections. It supports command execution, file transfer, and database sessions while preserving JumpServer filtering, ACLs, and audit logs. Use it for bastion-based operations. RDP is unsupported; database sessions are read-only unless writes are explicitly enabled.
请帮我了解并安装插件:【jumpserver-dsh】【https://github.com/jumpserver-east/jumpserver-dsh】
把上面这条消息直接发给当前会话里的 DSH,让它帮你了解并安装。安装命令不一定准确,发给 DSH 更稳。Send this message to DSH in your current session. CLI install commands may not be accurate across systems — DSH will figure it out for you.
或使用命令行安装(适合开发者)Or use CLI install (for developers)
命令行安装CLI Install
dsh plugin --profile web add @jumpserver-east/jumpserver-dsh
把 jumpserver-east/jumpserver-dsh 加入你的 DSH 配置(web profile)即可启用。
READMEREADME
jumpserver-dsh
DeepSeek Harness 插件:让 agent 通过 JumpServer 管理资产,并经 KoKo 堡垒在资产上执行命令 / 读写文件。流量不直连资产 IP,命令过滤、ACL、会话审计仍然生效。
本版本支持 SSH / SFTP 主机,以及经 KoKo 的 数据库(MySQL、MariaDB、PostgreSQL、Redis、MongoDB、Oracle、SQL Server 等)。RDP / 图形协议不在范围内。未授权时数据库会话只能查询;INSERT / UPDATE / DELETE 等写操作需要显式打开 JUMPSERVER_ENABLE_DB_WRITE。
兼容版本
插件调用 JumpServer Core REST API v1(Access Key 签名、用户资产授权、connection-token、client-url、主机资产 CRUD)。Core 与 KoKo 须为同一发行版本。
| 产品 | 支持的版本 |
|---|---|
| JumpServer | v3.10 LTS(v3.10.0 ~ 当前 v3.10.22)、v4.10 LTS(v4.10.0 ~ 当前 v4.10.18) |
| DeepSeek Harness | >= 0.1.0-rc.6(开发预览,接口可能变化) |
安装
dsh plugin 会把命令转给 pnpm,在目标 profile 目录里装包。本机需要 Node.js、pnpm(macOS 可用 brew install pnpm),以及 DeepSeek Harness CLI。
dsh 不是系统自带命令。没装过全局包时用:
npx @deepseek-ai/dsh <子命令>
也可以 npm install -g @deepseek-ai/dsh,之后直接打 dsh。不要用 Homebrew 的 dsh 配方,那是另一个 Unix 工具。
下面命令里的 dsh 都可以换成 npx @deepseek-ai/dsh。web profile 的配置在 ~/.dsh/profiles/web/(Windows 为 %USERPROFILE%\.dsh\profiles\web\)。
从 npm 安装
dsh plugin --profile web add @jumpserver-east/jumpserver-dsh
0.1.1 起已内置不带原生编译脚本的 ssh2,从 npm 安装一般不必改 allowBuilds。刚发布的 24 小时内,pnpm 11 可能报 ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION,等过截止时间或临时加 minimumReleaseAge: 0。
从 GitHub 安装
dsh plugin --profile web add github:jumpserver-east/jumpserver-dsh
pnpm 会把仓库拉到临时目录,先跑插件自己的 pnpm install,再执行 prepare(tsc)。实测会依次碰到两道拦:
- 构建授权
报ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED。把 pnpm 打印的 key 写进该 profile 的pnpm-workspace.yaml后重跑:
allowBuilds:
jumpserver-dsh: true
若打印的是带 tarball URL 的长 key,按它原样加一行。
- 包太新
报ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION。pnpm 11 默认拒绝 lockfile 里发布时间不足约 24 小时的包。DeepSeek Harness 刚发 rc 时,@deepseek-ai/*很容易踩中。
可以等过截止时间再装,或在该 profile 的pnpm-workspace.yaml里临时加minimumReleaseAge: 0后重试。也可以改走下面的本地安装——本地link:不会在临时目录里按插件 lockfile 再装一遍。
可以用 github:jumpserver-east/jumpserver-dsh#<sha> 钉死提交。
从本地仓库安装
适合改插件,或 GitHub 安装被年龄检查拦住时。
cd jumpserver-dsh
pnpm install --config.minimum-release-age=0
pnpm build
dsh plugin --profile web add .
--config.minimum-release-age=0 只在本仓库 pnpm install 也触发同样检查时需要;包够老了可以去掉。add . 必须在仓库目录执行(. 相对的是当前工作目录,不是 profile 目录)。
成功后 profile 的 package.json 应类似:
{
"dependencies": {
"@jumpserver-east/jumpserver-dsh": "link:/绝对路径/jumpserver-dsh"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"@jumpserver-east/jumpserver-dsh"
]
}
}
}
dsh plugin add 会自己核对 bundles。若命令很慢或中途失败,可以在 profile 目录直接 link,再把 @jumpserver-east/jumpserver-dsh 写进 dsh.profile.bundles:
cd ~/.dsh/profiles/web
pnpm add /绝对路径/jumpserver-dsh
改本地代码后执行 pnpm build,再重启 dsh。
本地 add . 是 link:,一般不必再为 ssh2 改 allowBuilds。GitHub 安装仍要批准插件自己的 prepare(tsc)。
配置
dsh 的「插件配置」页不会根据插件 Config 自动出表单,目前只展示 Host 白名单里的官方卡片(Shell、Agent loop、Web search)。第三方插件进不了这一页,所以 JumpServer 没有设置页。装好后新建下面的 .env,再重启 dsh。
需配置 — $DSH_HOME/.env
dsh 主目录默认为:
- macOS / Linux:
~/.dsh - Windows:
%USERPROFILE%\.dsh
在该目录新建 .env(安装插件时不会自动生成,可对照本仓库的 .env.example):
JUMPSERVER_URL=https://jms.example.com
JUMPSERVER_ORG_ID=00000000-0000-0000-0000-000000000002
JUMPSERVER_ACCESS_KEY_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
JUMPSERVER_ACCESS_KEY_SECRET=********************************
JUMPSERVER_ENABLE_ASSET_ADMIN=false
JUMPSERVER_ENABLE_DB_WRITE=false
Access Key 在 JumpServer「个人设置」里创建。跑 dsh 的这台机器要能连上 JumpServer Core(HTTPS)和 KoKo SSH;KoKo 的地址和端口会从 connection-token 自动带出,不用单独填。
JUMPSERVER_ORG_ID不写则使用 JumpServer 的 Default 组织。换组织改这一行后重启 dsh 即可。JUMPSERVER_ENABLE_ASSET_ADMIN默认false:只能列出、连接该 Access Key 已有权限的资产。设为true会额外注册创建 / 更新 / 删除主机的工具(jms_list_platforms、jms_create_host、jms_update_host、jms_delete_host)。请求仍走 Core RBAC,也不会绕过 KoKo。没有主机管理权限时保持false。JUMPSERVER_ENABLE_DB_WRITE默认false:数据库会话只允许查询(SELECT/SHOW/DESCRIBE/EXPLAIN以及 Redis 读命令等)。设为true才允许INSERT/UPDATE/DELETE等写语句。JumpServer 自己的命令过滤仍然生效。没有写库授权时保持false。
密钥也可以放进 $DSH_HOME/.credentials.yaml,变量名相同。JumpServer 地址写在 .env 的 JUMPSERVER_URL 即可,也可以写在下一节 cordis.patch.yml 的 baseUrl。
可选 — cordis.patch.yml
只有在需要用 baseUrl 覆盖 JUMPSERVER_URL 时,才改这个文件:
- macOS / Linux:
~/.dsh/profiles/web/cordis.patch.yml - Windows:
%USERPROFILE%\.dsh\profiles\web\cordis.patch.yml
- update:
- id: jumpserver
name: "@jumpserver-east/jumpserver-dsh"
config:
baseUrl: https://jms.example.com
tlsRejectUnauthorized: true
tlsRejectUnauthorized 默认 false(内网自签证书可连)。设为 true 时按系统 CA 校验 Core 的 HTTPS 证书。
使用
写好 .env 后重启 web profile:
dsh --profile web
在对话里用自然语言即可,不必写工具名,例如:
查看我当前 JumpServer 可连接的资产有哪些
或:
先确认 JumpServer 登录,再列出我能连的资产;连上 xxx 执行 hostname,然后断开。
agent 会按需调用 jms_* 工具。不要让它直接 SSH 资产 IP。
工具
默认可用:
jms_whoami— 确认当前 API 用户jms_list_assets/jms_get_asset/jms_list_accounts/jms_list_nodesjms_connect— 创建 connection-token,经 KoKo 建会话(用户名JMS-<token-id>)。主机走 SSH exec;数据库走 KoKo PTY(usql),连不上库时这里就会失败。可省略 protocol(按资产 type/category 判断);mssql会当成sqlserverjms_exec— 在主机上执行命令(可审计)。不要用它跑数据库 SQLjms_sql— 在已就绪的数据库 PTY 上执行 SQL / Redis / Mongo 命令。未授权只能查询jms_read_file/jms_write_file— 经 KoKo 做 SFTP(仅主机会话)jms_list_sessions/jms_disconnect
JUMPSERVER_ENABLE_ASSET_ADMIN=true 时额外提供:
jms_list_platforms/jms_create_host/jms_update_host/jms_delete_host
典型顺序:列出资产 → 列出账号 → 连接 → 执行 / 查库 → 断开。查数据库时用 jms_list_assets 加 category=database。
开发
pnpm install --config.minimum-release-age=0
pnpm test
pnpm build
--config.minimum-release-age=0 同上,仅在 pnpm 11 因 @deepseek-ai/* 发布时间不足 24 小时拒装时需要。
License
MIT.
nexu-io/open-design
freestylefly/awesome-gpt-image-2
anywhere-labs/dsh-desktop
walkinglabs/learn-harness-engineering
awesome-dsh-plugin/awesome-dsh-plugin
MemTensor/MemOS