tunnel-dsh-plugin
Cloudflare Named Tunnel 生命周期插件 —— 让任意 dsh 插件的 loopback 看板按需、限时、可撤销地对外暴露
loadchange
@loadchange
⬇ 2
★ 0
main
安装
dsh plugin --profile web add github:loadchange/tunnel-dsh-plugin
需要可复现安装时,可在仓库后追加 #commit 固定提交。
Cloudflare Named Tunnel 生命周期插件 —— 让任意 dsh 插件的 loopback 看板按需、限时、可撤销地对外暴露
该插件未提供要点说明,请参考仓库 README。
- 安装并启动 DeepSeek Harness:
npx @deepseek-ai/dsh web - 在终端执行上面的安装命令(CLI 会解析插件并核验来源)
- 用 dsh plugins list 确认已安装,必要时重启 Harness 生效
插件以当前 dsh 进程的权限运行,安装时可能执行代码。请先通读仓库源码与许可证,确认无破坏性命令与越权访问;本站只做索引,不对第三方插件安全性作担保。
| 代码仓库 | github.com/loadchange/tunnel-dsh-plugin |
| 许可证 | 未标注(见仓库) |
| 主要语言 | main |
| 下载量 | 2 |
| GitHub 星标 | 0 |
| 最近推送 | 2026-09-08 |
| 收录日期 | 2026-09-19 |
| 分类 | 工具与能力 |
事实信息来自公开插件目录快照(2026-10-01),介绍文案由本站再加工。
以下为插件仓库 README 全文(原始内容,由公开目录抓取整理)。
# dsh-plugin-tunnel
把任意 dsh 插件的 **loopback 看板**,按需、限时、可撤销地暴露到公网——并且只做这一件事。
## 能力边界
插件侧持有的只有一份**目录**(哪些看板存在、叫什么)和一个受限的调用边界。
真正的事实全部在 root 手里:
| 事实 | 谁说了算 |
|---|---|
| 哪些目标可达 | `/etc/dsh-tunnel/targets/.conf` 是否存在且归 root |
| 最大暴露时长 | 描述文件的 `ttl_seconds` + systemd `RuntimeMaxSec` drop-in,**双重强制** |
| 源站是哪个端口 | 描述文件的 `origin_port`,模型不可见 |
| 公网是否真的被 Access 保护 | 每次开启做匿名探测,未被重定向到登录域即立即停止 |
| 运行期是否仍然安全 | 看门狗每 10 秒复核连接器/入口/源站/边缘,漂移即关闭 |
即使插件配置被完全篡改,可达目标集合与最大暴露时长也不会变化——配置里写一个
未部署的目标,只会让开启请求被 helper 拒绝。
## 使用
### 在 profile 里登记目标
```yaml
- id: tunnel
config:
targets:
- name: console
title: 运行状态看板
description: 实时指标、决策记录与运行日志
- name: metrics
title: 指标面板
description: 只读的聚合视图
```
`name` 必须与生产机上 `/etc/dsh-tunnel/targets/.conf` 同名。
### 由插件自己登记(推荐)
看板归谁,登记就由谁做——这样标题和描述不会和实现漂移:
```ts
export const inject = ['tunnel']
export function apply(ctx: Context) {
const dispose = ctx.tunnel.register({
name: 'console',
title: '运行状态看板',
description: '实时指标、决策记录与运行日志',
})
ctx.on('dispose', dispose)
}
```
### 在 IM 里用
模型拿到的是一个 `tunnel_control` 工具:
- `list` —— 有哪些看板(本地读目录,不触发任何特权调用)
- `status` —— 每条隧道的状态与 `expires_at`
- `open ` —— 开一条限时隧道
- `close ` —— 关掉某一条,其余不受影响
- `close-all` —— 全关
典型对话:「打开状态看板」→ `open console` → 返回公网地址与到期时间;
「看完了,关掉」→ `close console`。
### 编程调用
```ts
await ctx.tunnel.open('console')
await ctx.tunnel.status()
await ctx.tunnel.closeAll()
```
## 部署
```bash
# 1. 装特权层(可执行文件、模板单元、tmpfiles、sudoers)。不创建任何目标。
sudo ./deploy/install.sh
# 2. 逐个下发目标。凭据一律文件到文件,绝不经过命令行参数。
sudo ./deploy/provision-target.sh console \
./console.conf ./token ./uuid ./hostname ./aud
```
描述文件的字段说明见 [`deploy/targets/example.conf`](deploy/targets/example.conf)。
`sudoers` 里把调用用户改成实际运行 dsh Host 的那个用户。
sudoers 只钉死 helper 路径与四个动词;目标名是可变参数,由 root 侧用
「字面形状 + 必须存在同名 root 持有描述文件」两道校验收敛。
## 开发
```bash
npm ci
npm run check && npm test # 类型检查 + 28 项测试
npm run build
npm run lint:sh # 特权脚本语法检查
```
测试不触网、不需要真实凭据:特权 helper 全部由注入的假执行器代替。
数据来源:公开的 DeepSeek Harness 插件目录与各插件 GitHub 仓库。本站为独立第三方目录,与 DeepSeek、幻方(High-Flyer)及插件作者均无隶属或背书关系。