把会话接入另一台机器的工具环境执行调用
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/7 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Eru07734/dsh-native-env-v2该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 26 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/7) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 36 处,展示前 35 条)
- 发起网络请求plugins/dsh-native-env-v2/lib/client.js:182
const remote = validateHello(await wire.request(V2_METHODS.hello, hello, AbortSignal.timeout(this.config.handshakeTimeoutMs ?? 10000))) - 发起网络请求plugins/dsh-native-env-v2/lib/client.js:186
const payload = await wire.request(V2_METHODS.list, {}, AbortSignal.timeout(this.config.listTimeoutMs ?? 30000)) - 发起网络请求plugins/dsh-native-env-v2/lib/client.js:193
const payload = await wire.request(METHODS.list, {}, AbortSignal.timeout(this.config.listTimeoutMs ?? 30000)) - 发起网络请求plugins/dsh-native-env-v2/lib/client.js:241
const payload = await wire.request(this.currentMethods().list, {}, AbortSignal.timeout(this.config.listTimeoutMs ?? 30000)) - 发起网络请求plugins/dsh-native-env-v2/lib/client.js:268
return await wire.request(this.currentMethods().call, { callId, name, arguments: args ?? {} }, signal) - 发起网络请求plugins/dsh-native-env-v2/lib/client.js:279
wire.request(this.currentMethods().cancel, { callId }, AbortSignal.timeout(10000)).catch(() => { - 执行外部命令来自配置/变量plugins/dsh-native-env-v2/lib/client.js:326
child = spawn(command, args, { cwd, stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true }) - 读取本地文件plugins/dsh-native-env-v2/lib/guest.js:126
if (config.tokenFile !== undefined) return readFileSync(config.tokenFile, 'utf8').trim() - 发起网络请求plugins/dsh-native-env-v2/lib/handshake.js:150
const hello = await wire.request( - 发起网络请求plugins/dsh-native-env-v2/lib/handshake.js:163
const ack = await wire.request(AUTH_METHOD, { hmac: peerProof(token, clientNonce, serverNonce) }, AbortSignal.timeout(timeoutMs)) - 读取本地文件plugins/dsh-native-env-v2/lib/host.js:175
try { persistedEnabled = readFileSync(enabledFile, 'utf8').trim() } catch {} - 读取本地文件plugins/dsh-native-env-v2/lib/host.js:212
if (config.tokenFile !== undefined) return readFileSync(config.tokenFile, 'utf8').trim() - 写入本地文件plugins/dsh-native-env-v2/lib/host.js:764
writeFileSync(target, enabled ? '1\n' : '0\n', 'utf8') - 读取本地文件plugins/dsh-native-env-v2/lib/migration.js:27
const found = packageHasLegacy || patchHasLegacy || existsSync(join(root, 'native-env.enabled')) - 读取本地文件plugins/dsh-native-env-v2/lib/migration.js:35
enabledFlag: existsSync(join(root, 'native-env.enabled')), - 读取本地文件plugins/dsh-native-env-v2/lib/migration.js:50
return readFileSync(path, 'utf8') - 读取本地文件plugins/dsh-native-env-v2/lib/quick-tunnel.js:21
try { return (await stat(file)).isFile() } catch { return false } - 执行外部命令来自配置/变量plugins/dsh-native-env-v2/lib/quick-tunnel.js:37
const result = execFileSync(process.platform === 'win32' ? 'where.exe' : 'which', ['cloudflared'], { - 写入本地文件plugins/dsh-native-env-v2/lib/quick-tunnel.js:54
await mkdir(directory, { recursive: true }) - 请求外部主机api.github.complugins/dsh-native-env-v2/lib/quick-tunnel.js:60
const release = await fetch('https://api.github.com/repos/cloudflare/cloudflared/releases/latest', { - 发起网络请求plugins/dsh-native-env-v2/lib/quick-tunnel.js:60
const release = await fetch('https://api.github.com/repos/cloudflare/cloudflared/releases/latest', { - 发起网络请求plugins/dsh-native-env-v2/lib/quick-tunnel.js:68
response = await fetch(assetInfo.url, { redirect: 'follow', signal, headers: { Accept: 'application/octet-stream', 'User-Agent': 'dsh-native-env-v2' } - 发起网络请求plugins/dsh-native-env-v2/lib/quick-tunnel.js:75
response = await fetch(url, { redirect: 'follow', signal }) - 写入本地文件plugins/dsh-native-env-v2/lib/quick-tunnel.js:83
await writeFile(temporary, bytes, { signal }) - 写入本地文件plugins/dsh-native-env-v2/lib/quick-tunnel.js:90
if (process.platform !== 'win32') await chmod(executable, 0o755) - 写入本地文件plugins/dsh-native-env-v2/lib/quick-tunnel.js:91
await rename(executable, cache) - 删除本地文件递归plugins/dsh-native-env-v2/lib/quick-tunnel.js:94
await rm(temporaryDirectory, { recursive: true, force: true }).catch(() => {}) - 发起网络请求plugins/dsh-native-env-v2/lib/relay-client.js:322
response = await fetch(options.url, { - 读取本地文件plugins/dsh-native-env-v2/lib/state-store.js:72
if (!existsSync(this.file)) { - 读取本地文件plugins/dsh-native-env-v2/lib/state-store.js:77
const parsed = JSON.parse(readFileSync(this.file, 'utf8')) - 写入本地文件plugins/dsh-native-env-v2/lib/state-store.js:116
mkdirSync(dirname(this.file), { recursive: true }) - 写入本地文件plugins/dsh-native-env-v2/lib/state-store.js:118
writeFileSync(temporary, `${JSON.stringify(next, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }) - 写入本地文件plugins/dsh-native-env-v2/lib/state-store.js:119
renameSync(temporary, this.file) - 读取本地文件plugins/dsh-native-env-v2/lib/state-store.js:130
if (existsSync(this.file)) unlinkSync(this.file) - 删除本地文件plugins/dsh-native-env-v2/lib/state-store.js:130
if (existsSync(this.file)) unlinkSync(this.file)
扫描于 2026/11/1(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.github.com
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 按会话隔离远程环境
- 端到端加密配对
- SSH/TCP传输
README
由 DeepSeek 最新模型翻译生成DSH Native Env v2
把 DSH 会话连接到另一台机器的 DSH 工具环境。进入远端后,工具调用交给远端运行时执行;退出后回到本机。连接断开时,挂起调用报错并移除远端工具映射,重连不会重放旧调用,需要重新进入环境。
本仓库包含插件源码、独立配对 relay、跨平台安装脚本和自动化测试。它是本机开发版本的脱敏发布副本,版本为 0.1.0;不包含机器凭据、配对状态、运行日志或实机测试配置。插件仍处于早期阶段,目标 DSH 版本为 0.1.7-rc.2,Node.js 20 或以上。
flowchart LR
A[DSH 会话 / controller] -->|TCP 或 SSH stdio| B[远端 DSH / server]
A <-->|端到端加密配对| R[relay]
R <-->|转发密文| B
功能与组件
| 组件 | 作用 | 默认状态 |
| dsh-native-env-v2 | controller、会话进入/退出、配对和设置页 | 启用,连接配置为空 |
| dsh-native-env-v2/server | 提供当前机器的 DSH 工具环境 | 关闭 |
| dsh-native-env-v2/public | 内嵌 relay + Cloudflare Quick Tunnel | 关闭 |
展开完整文档(README 剩余 1 节)
DSH Native Env v2
把 DSH 会话连接到另一台机器的 DSH 工具环境。进入远端后,工具调用交给远端运行时执行;退出后回到本机。连接断开时,挂起调用报错并移除远端工具映射,重连不会重放旧调用,需要重新进入环境。
本仓库包含插件源码、独立配对 relay、跨平台安装脚本和自动化测试。它是本机开发版本的脱敏发布副本,版本为 0.1.0;不包含机器凭据、配对状态、运行日志或实机测试配置。插件仍处于早期阶段,目标 DSH 版本为 0.1.7-rc.2,Node.js 20 或以上。
flowchart LR
A[DSH 会话 / controller] -->|TCP 或 SSH stdio| B[远端 DSH / server]
A <-->|端到端加密配对| R[relay]
R <-->|转发密文| B
功能与组件
| 组件 | 作用 | 默认状态 |
| dsh-native-env-v2 | controller、会话进入/退出、配对和设置页 | 启用,连接配置为空 |
| dsh-native-env-v2/server | 提供当前机器的 DSH 工具环境 | 关闭 |
| dsh-native-env-v2/public | 内嵌 relay + Cloudflare Quick Tunnel | 关闭 |
| dsh-native-env-v2/full | 放开桥接默认工具排除项 | 关闭 |
- 支持 v2 的 env2/hello、工具目录、能力/修订号协商、调用、取消及工具变更通知,也保留 env/* 兼容层。
- 支持 SSH stdio、认证 TCP,以及邀请链接/二维码/设备码配对。
- 设置页提供连接状态、配对和组件状态;env_status、env_enter、env_exit、env_invite 可在会话中使用。
- public 只公开配对 relay 的 WebSocket 端点。首次使用可能下载官方 cloudflared;可以通过 cloudflaredPath 指定已有程序。
- full 保留本地退出控制和配置中的 exclude,权限仍由远端 DSH 与操作系统决定。UI、附件等工具的调用可序列化转发,但不提供远端窗口或附件引用适配。
安装插件
1. 将 plugins/dsh-native-env-v2 整个目录复制到固定位置,例如 Windows 的 C:/dsh-plugins/dsh-native-env-v2 或 Linux 的 /opt/dsh-plugins/dsh-native-env-v2。
2. 在目标 DSH profile 的补丁中加入 controller/server 行,参考 examples/controller.patch.yml 和 examples/server.patch.yml。将示例中的路径改成实际包目录绝对路径。controller 用包根入口,以便 DSH 同时发现浏览器组件。
3. 重启或按 profile 的重载策略重载 DSH。controller 的设置入口位于 设置 → DSH Native Env v2。
4. 在 controller 上配置双方可访问的同一个 relay;本机试用可在仓库根目录执行 node relay/main.js,对应地址为 ws://127.0.0.1:8931/v2/relay。跨机器使用时需改为可达地址,公开部署使用 TLS。
5. 在设置页接受配对说明,创建邀请或设备卡;在提供工具的机器上连接该邀请。设备码模式应核对双方显示的六位短码。连接成功后,通过 env_status 查看 peer,再执行 env_enter({"peer":"<peer-name>"})。执行 env_exit({}) 返回本机。
若通过 DSH 插件管理器导入本地包,可使用插件自带的 cordis.patch.yml。内置补丁的 controller 初始没有 relay/peer/listener,server、public、full 均默认关闭。示例行应与现有行合并,避免重复加载 controller。
SSH 与 Windows guest
SSH stdio 适合已配置 SSH 登录的机器,不需要桥接 TCP 令牌。在 guest 上复制完整插件目录后:
DSH_NATIVE_ENV_DIR=/opt/dsh-plugins/dsh-native-env-v2 \
bash /opt/dsh-plugins/dsh-native-env-v2/bin/guest-install.sh --verify
该脚本创建/维护专用 env profile,并使用 dsh-base。SSH 主机配置见 examples/ssh-controller.patch.yml。不要让 ACP stdio 服务与环境桥接共用 stdout。guest 上需要已有可用的 DSH 和 dsh 命令。
Windows guest 可使用 bin/guest-install.ps1 和 bin/guest-run-standalone.ps1;详见脚本头部参数说明。TCP 共享令牌应放在本机文件或环境变量中,通过 tokenFile/tokenEnv 引用。不要提交真实令牌。
开发与验证
运行时代码只依赖 Node 内置模块,不需要安装 npm 运行时依赖。开发依赖 qrcode 仅用于对 QR 编码器进行独立比对,不随插件运行。
安装 Node.js 和 pnpm 11.7.0 后,在仓库根目录执行:
pnpm install --frozen-lockfile
pnpm check
pnpm test
也可以不安装开发依赖直接执行:
node scripts/check-publication.mjs
node scripts/test.mjs
未安装 qrcode 时,四项独立 QR 比对测试会跳过;其余测试仍运行。测试使用内存通道、本机临时目录和 loopback relay,不连接原开发机器或云实例。GitHub Actions 在 Windows/Linux 上检查源码并运行完整测试。
check 检查 JavaScript 语法以及常见令牌、私钥、个人 Windows 路径、非示例 IPv4 和本机状态文件。它只报告文件位置,不打印匹配值;它是发布检查的补充,不能替代人工审查。
独立 relay
node relay/main.js
默认监听 127.0.0.1:8931,健康检查为 /healthz。部署配置、TLS、nginx、systemd 和协议说明见 relay 文档。从仓库根目录构建 Docker 镜像:
docker build -f relay/Dockerfile -t dsh-native-env-relay .
docker run --rm -p 127.0.0.1:8931:8931 dsh-native-env-relay
relay 可以看到连接地址、邀请槽、消息大小和时间,并在邀请有效期内持有 rendezvous secret;工具调用 payload 使用端到端加密。指纹邀请与手输设备码的信任方式不同,详见 relay 文档。正式部署需要自行提供可用 relay 或启用 public,仓库不提供公共服务地址。
目录
plugins/dsh-native-env-v2/ 插件、浏览器组件、locale、guest 安装脚本和测试 relay/ 独立 relay、Dockerfile、systemd 配置及测试 examples/ 通用 controller/server/SSH 配置 scripts/ 测试入口和发布检查 .github/workflows/ Windows/Linux 持续集成
脱敏范围与发布验证说明见 PUBLISHING.md。许可证为 MIT。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Eru07734/dsh-native-env-v2
把会话接入另一台机器的工具环境执行调用
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9