dsh-pc-bridge:给可信对端开一条回环 HTTP 桥

前言

智能体跑在云端,手里没有本地环境,就没法在你自己的机器上列目录、读 git 日志、跑一条构建命令。传统做法是自己写一个常驻服务,再想办法处理鉴权、超时、输出截断和断线重连,工程量不小;用 ssh 直连又要逐台维护密钥和端口映射。

dsh-pc-bridge 把这套东西压成一个 DSH 插件:在电脑上开一个只监听回环的小 HTTP 桥,对端(例如云端的 QQ 机器人)可以 ping 这台电脑,也能按需执行 shell 命令;可选同时维持一条 ssh 反向隧道,让远端在自己那台机器的回环上就能访问到这台电脑的桥。插件由 QIC-9821 维护,分类是「联网工具」,许可 MIT,仓库里也没有第三方运行时依赖。

下面介绍的事实来自 GitHub README 与 package.json。星标数以 skillhub.cn 目录页为准,当前为 0。

这是个什么插件

一句话:它把「这台机器能不能被远端调用」变成两个工具调用(pc_ping / pc_exec)和一个 curl 接口,而不是把一台电脑直接暴露到公网。

  • Host 桥:node:http 服务,提供 POST /exec、GET|POST /ping,每个请求都要带 x-pc-secret 头。
  • 工具:Agent 侧可调用 pc_ping(探活)与 pc_exec(执行命令),默认打 http://127.0.0.1:18790。
  • 隧道管理器:tunnelEnabled: true 时守着 ssh -N -R ...,断了按 5/10/30/60 秒退避重连;远端 sshd 残留占用端口时先 fuser -k 再重试。
  • CLI:仓库自带 pcctl,pcctl ping、pcctl exec -- "hostname" 可以在终端里直接调桥,不依赖 Harness。

安装与启用

README 给了三种安装方式,选一即可。

# npm(推荐)
dsh plugin add dsh-pc-bridge

# 直接从 GitHub tag 装
dsh plugin add github:QIC-9821/dsh-pc-bridge#v0.1.0

# 本地目录(开发时)
dsh plugin add /absolute/path/to/dsh-pc-bridge

也可以在插件管理器里把本目录当 bundle 安装。要求 Node.js ≥ 22,没有任何第三方运行时依赖;package.json 里版本是 0.1.1。

安装后在 Harness 设置里找到「电脑执行桥」,按下面的键配置。

- id: dsh-pc-bridge
  name: 'dsh-pc-bridge'
  config:
    role: both
    listenHost: 127.0.0.1
    listenPort: 18790
    tunnelEnabled: true
    sshHost: 203.0.113.10
    sshUser: dsh
    sshKeyPath: C:/Users/me/.ssh/id_ed25519

role 有 host(只开桥)、client(只注册工具/隧道)、both(全开)三种取值,默认 both。

配置要点

默认值全部来自 README 的配置表,别改的两条先说:listenHost 默认 127.0.0.1,README 明确写了不要改成 0.0.0.0。

键 默认 说明
role both host 只开桥;client 只注册工具/隧道;both 全开
listenHost 127.0.0.1 监听地址,不要改成 0.0.0.0
listenPort 18790 监听端口
secretFile $DSH_HOME/pc-bridge/secret 密钥文件;不存在时 host 角色自动生成(32 字节 hex,权限 600)
secretEnv DSH_PC_BRIDGE_SECRET 优先级高于密钥文件的环境变量名
peerUrl http://127.0.0.1:18790 工具调用哪个桥
defaultTimeoutMs 30000 默认命令超时
maxTimeoutMs 600000 请求可指定的最大超时(10 分钟)
maxOutputBytes 2097152 stdout/stderr 各自截断上限,超出部分标记 truncated
shellPath 自动 默认 Windows 优先 Git Bash(C:\Program Files\Git\bin\bash.exe),没有才用 PowerShell;POSIX 用 /bin/bash
cwd 当前目录 命令工作目录
tunnelEnabled false 是否维持 ssh 反向隧道
sshHost / sshUser 空 隧道目标
sshKeyPath 空 私钥路径;空 = 默认密钥
tunnelRemotePort / tunnelLocalPort 18790 远端/本端端口(都绑 127.0.0.1)

密钥有两条来源:DSH_PC_BRIDGE_SECRET 环境变量优先级最高,否则用 secretFile;host 角色在文件不存在时会自动生成。密钥不写进配置文件,日志只记录来源是 env: 还是 file:,不记录值。

典型用法

对端先用 curl 自测桥通不通,隧道建好之后对端的回环上就会出现这台电脑的桥:

curl -s http://127.0.0.1:18790/ping -H "x-pc-secret: $DSH_PC_BRIDGE_SECRET"

Agent 侧的工具签名是:

  • pc_ping:返回 {ok, host, user, shell, now} 或网络错误。
  • pc_exec {"command":"...","timeoutSec":30}:返回 {ok, exitCode, stdout, stderr, durationMs, timedOut, truncated}。

不写 Harness 集成、只想在终端调也行,pcctl 的地位和 curl 等价:

PC_BRIDGE_SECRET=... pcctl ping
PC_BRIDGE_SECRET=... pcctl exec -- "hostname; echo OK"

对端(以云服务器为例)的准备步骤是:

  1. 把电脑的公钥加到对端用户的 ~/.ssh/authorized_keys。
  2. 对端把共享密钥放进进程环境,例如 systemd:Environment=DSH_PC_BRIDGE_SECRET=替换成同一串。
  3. 对端执行上面的 curl 自测;隧道通了之后这台电脑的桥就出现在对端回环上。
  4. 对端也可以直接用 pcctl。

README 里的演示路径就是这条链路:云端的 QQ 机器人问一句「这台机器在不在」,回的是主机名、用户、shell 类型和服务器时间;要拿东西就在电脑上跑命令,例如列目录、读 git 提交记录。

适用场景与注意

适合:有一台自己长期在线、又需要被云端 Agent 调用执行本地命令的电脑,且你愿意维护一条到对端的信任关系。桥本身只有回环接口,隧道也把两端都绑在 127.0.0.1,不向公网开端口。

调用侧可以按需要选择 role:只想让 Agent 发命令、不在这台机器上开端口,就配 client。

需要明确的几点:

  • 桥提供的是任意命令执行能力。README 明确要求只把密钥给可信的对端,只在对端可信时才开隧道。
  • 本插件以当前 dsh 进程的权限运行,能执行什么命令取决于启动 Harness 的那个用户。安装前请先读一遍源码和许可证(MIT),确认没有超出预期的行为。
  • 命令经由 Git Bash 执行,PATH 里没有 Node,能用的命令以本机 Git Bash 为准;defaultTimeoutMs 默认 30 秒,长任务要显式传 timeoutSec。
  • 请求体上限 64 KiB、命令上限 8 KiB,输出按 maxOutputBytes 截断并标记 truncated,超时会杀进程树。

结尾

dsh-pc-bridge 的价值不在于发明新的远程执行方案,而在于把回环监听、共享密钥鉴权、超时/截断钳制、SSH 反向隧道的退避重连这四件事打包成一个能被 Agent 直接调用的工具,省掉自己写常驻服务的工作量。

目录页:https://www.skillhub.cn/plugins/QIC-9821/dsh-pc-bridge
仓库:https://github.com/QIC-9821/dsh-pc-bridge

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜