🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

手机访问网关 iTrimut/dsh-Webroad

DeepSeek 客户端
iTrimut62 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

扫码让手机连上本机 DSH,局域网公网都能用

29.1/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/iTrimut/dsh-Webroad.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 62 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-webroad(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/23 02:26:19

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 36 处,展示前 36 条)
  • 读取本地文件
    lib/index.js:124
    if (!existsSync(join(source, 'SKILL.md'))) return;
  • 读取本地文件
    lib/index.js:125
    if (existsSync(join(target, 'SKILL.md'))) return;
  • 写入本地文件
    lib/index.js:131
    mkdirSync(dst, { recursive: true });
  • 读取本地文件
    lib/index.js:132
    for (const entry of readdirSync(src)) {
  • 读取本地文件
    lib/index.js:135
    if (statSync(from).isDirectory()) copyTree(from, to);
  • 写入本地文件
    lib/index.js:136
    else copyFileSync(from, to);
  • 发起网络请求
    bin/dsh-webroad.mjs:31
    const res = await fetch(`http://127.0.0.1:${port}${path}`, {
  • 读取本地文件
    lib/service.js:53
    const v = readFileSync('/proc/version', 'utf8').toLowerCase();
  • 执行外部命令来自配置/变量
    lib/service.js:78
    execFile(candidates[i], [], { timeout: 5000, windowsHide: true }, (err, stdout) => {
  • 读取本地文件
    lib/settings.js:26
    return readFileSync(p, 'utf8').trim();
  • 写入本地文件
    lib/settings.js:34
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    lib/settings.js:35
    writeFileSync(p, content, { mode: 0o600 });
  • 写入本地文件
    lib/settings.js:118
    mkdirSync(dataDir(), { recursive: true });
  • 写入本地文件
    lib/settings.js:119
    writeFileSync(settingsPath(), JSON.stringify(settings, null, 2), { mode: 0o600 });
  • 删除本地文件
    lib/settings.js:167
    rmSync(autoTunnelPath(), { force: true });
  • 读取本地文件
    lib/tunnel.js:59
    await access(p);
  • 执行外部命令固定命令
    lib/tunnel.js:71
    execSync('cloudflared --version', { stdio: 'ignore', timeout: 5000 });
  • 写入本地文件
    lib/tunnel.js:84
    await mkdir(dirname(dest), { recursive: true });
  • 删除本地文件
    lib/tunnel.js:94
    await rm(tmp, { force: true });
  • 写入本地文件
    lib/tunnel.js:95
    if (await exists(dest)) { await chmod(dest, 0o755); return; }
  • 删除本地文件
    lib/tunnel.js:103
    await rm(tmp, { force: true }).catch(() => {});
  • 写入本地文件
    lib/tunnel.js:106
    await rename(tmp, dest);
  • 写入本地文件
    lib/tunnel.js:107
    await chmod(dest, 0o755);
  • 删除本地文件
    lib/tunnel.js:118
    await rm(dest, { force: true }).catch(() => {});
  • 发起网络请求
    lib/tunnel.js:119
    const res = await fetch(url, { redirect: 'follow', signal: AbortSignal.timeout(timeoutMs) });
  • 写入本地文件
    lib/tunnel.js:121
    const out = createWriteStream(dest);
  • 执行外部命令固定命令
    lib/tunnel.js:136
    execFileSync('tar', ['-xzf', tarPath, '-C', destDir, '--strip-components=1'], { stdio: 'ignore' });
  • 读取本地文件
    lib/tunnel.js:163
    const useNamed = existsSync(namedConfig);
  • 读取本地文件
    lib/tunnel.js:178
    if (useNamed && !existsSync(join(named, 'credentials.json'))) {
  • 执行外部命令来自配置/变量
    lib/tunnel.js:182
    const child = spawn(binary.cmd, [...binary.args, ...args], {
  • 读取本地文件
    lib/tunnel.js:242
    return readFileSync(p, 'utf8');
  • 写入本地文件
    client/build.mjs:41
    await mkdir(dirname(outputPath), { recursive: true });
  • 写入本地文件
    client/build.mjs:42
    await writeFile(outputPath, wrapped, 'utf8');
  • 读取本地文件
    files/auth-proxy.js:10
    const cfg = JSON.parse(fs.readFileSync(path.join(__dirname, 'auth-config.json'), 'utf8'));
  • 发起网络请求
    files/auth-proxy.js:40
    const proxy = http.request(
  • 发起网络请求
    files/auth-proxy.js:66
    const proxy = http.request({
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 扫码连接手机
  • 局域网公网访问
  • 8位PIN认证

DeepSeek Harness 手机访问一体化插件:设置页内嵌「📱 手机访问」,扫码即用(局域网+公网+固定域名),8 位 PIN 认证、零配置信任围栏;含 Tailscale Funnel 手动教程。

README

由 DeepSeek 最新模型翻译生成
📱 dsh-webroad DSH Web 手机访问一体化插件:设置页内嵌「📱 手机访问」,扫码即用(局域网 + 公网 + 固定域名) License Version [Node]() CI 把 dsh-pocket 式的一键自动化(改头代理免配 trustedHosts、8 位 PIN + 登录限速、WebSocket 心跳保活、gzip/brotli 压缩、局域网/公网二维码、cloudflared 隧道自动恢复)与自包含文档 + 手机端补丁(browse 目录选择器、polyfill、直达会话引导)结合在一起的 DSH 插件。DSH 设置页内嵌「📱 手机访问」入口,扫码即用;固定域名可复用已有 Cloudflare 命名隧道;并保留 Tailscale Funnel 手动教程(files/ 模板 + SKILL 备选方案节)。 安装(前置:pnpm 在 PATH;装完重启 dsh web)。
展开完整文档(README 剩余 1 节)
📱 dsh-webroad

DSH Web 手机访问一体化插件:设置页内嵌「📱 手机访问」,扫码即用(局域网 + 公网 + 固定域名)

License
Version
[Node]()
CI

把 dsh-pocket 式的一键自动化(改头代理免配 trustedHosts、8 位 PIN + 登录限速、WebSocket 心跳保活、gzip/brotli 压缩、局域网/公网二维码、cloudflared 隧道自动恢复)与自包含文档 + 手机端补丁(browse 目录选择器、polyfill、直达会话引导)结合在一起的 DSH 插件。DSH 设置页内嵌「📱 手机访问」入口,扫码即用;固定域名可复用已有 Cloudflare 命名隧道;并保留 Tailscale Funnel 手动教程(files/ 模板 + SKILL 备选方案节)。

安装(前置:pnpm 在 PATH;装完重启 dsh web)。三选一:

本地开发(推荐,无网络依赖)
dsh plugin --profile web add -w
海外网络:GitHub 直装
dsh plugin --profile web add github:iTrimut/dsh-Webroad -w
国内网络:git+ssh(走 SSH over 443,绕开被墙的 HTTPS)
dsh plugin --profile web add git+ssh://git@github.com/iTrimut/dsh-Webroad.git -w

-w 不能省(pnpm workspace-root 检查);github: 方式会让后续每次 pnpm 安装都重连 GitHub,国内不稳请用方式 1/3。装完 npx @deepseek-ai/dsh web 重启,浏览器开 http://127.0.0.1:3081/pocket 输局域网 PIN 即可验证。

使用(推荐):DSH 界面 → 设置 → 📱 手机访问 → 局域网/公网二维码 + 密码 + 开关全在这里。手机连同一 WiFi 扫局域网码输 PIN 即用;点「开启公网访问」出公网二维码,人在外面(4G/任何网络)也能访问。也可用独立面板 http://127.0.0.1:3081/pocket 或 CLI。

详见 skills/dsh-webroad/SKILL.md(完整自包含文档:关键点总结、架构、安装、使用、排障、验证清单、取代关系)。

特性

- 🏠 设置页内嵌入口:DSH 设置 →「📱 手机访问」— 二维码/密码/开关/免责声明全在设置页内,loopback RPC 驱动
- 📶 局域网扫码:代理自动起在 0.0.0.0:3081,出二维码,手机连同一 WiFi 扫码 + 8 位 PIN 即用(PIN 可关)
- 🌐 公网扫码:cloudflared 快速隧道(免账号免域名),每次开启自动换新 PIN,旧链接作废;服务端强制安全免责声明
- 🔒 安全认证:公网/局域网独立 8 位 PIN;登录限速(单 IP 5 次/60s 锁 60s + 全局锁);HttpOnly cookie 会话保持(绑定 dsh web 进程)
- ⚡ 实时可靠:WebSocket 全透传 + 协议层心跳保活(防 NAT/省电静默断链,断线自动重连)
- 🗜️ 省流量:大 JSON 自动 gzip/brotli 压缩(17MB 长会话 → ~1MB)
- 🧩 零配置围栏:改头代理让信任围栏永远看到 loopback,不改 DSH 任何配置
- 📱 手机端补丁:browse 目录选择器 + crypto.randomUUID/AbortSignal.any polyfill + 首次打开直达会话
- 🔁 隧道自动恢复:DSH 重启后自动重新拉起公网隧道(已实测)
- 🏷️ 固定域名(可选):$DSH_HOME/dsh-webroad/named/ 放 config.yml + credentials.json 即复用你自己的 Cloudflare 命名隧道
- 🔧 CLI:dsh-webroad status | qr | public on|off | pin set|rotate

测试与验证(全部实测通过)

npm install
npm test # 9 项单元测试:改头/压缩/认证限速/WS 心跳/面板 API/隧道 URL/LAN IP
node scripts/verify-live-panel.mjs # 真实 dsh web 端到端:登录→面板→二维码→WS 101
node scripts/e2e-panel.mjs # 独立进程完整浏览器流程(登录页→302→面板脚本编译→QR)

已实测:真实 dsh web 冒烟 10/10、公网快速隧道开启并经 Cloudflare 边缘访问、隧道自动恢复、设置页 client 注入(boot manifest 条目 + /plugins/dsh-webroad/client.js)。

与同类方案的差异

| | dsh-webroad | dsh-pocket | dsh-remote-access(已归档删除) |
| 设置页入口 | ✅ 内嵌「📱 手机访问」 | ✅ 设置页签 | ❌ |
| 安装后即用 | ✅ 扫码即用 | ✅ | ❌ 手动搭 |
| 信任围栏 | 改头代理(零配置) | 改头代理(零配置) | 手动 trustedHosts |
| 固定域名 | ✅ 可选(命名隧道) | ❌ 随机 URL | ✅(已并入本插件) |
| Funnel 手动教程 | ✅ 保留(files/ + SKILL 备选节) | ❌ | ❌ |
| 许可 | MIT | GPL-2.0 | MIT |
| 文档 | SKILL.md 自包含 + 验证清单 | README | SKILL.md |

许可

MIT —— 自由使用 / 修改 / 再分发。实现为原创代码(借鉴公开的“host rewrite 反向代理”通用思路与 DSH client 插件机制,未复制 dsh-pocket 的 GPL 代码)。

由 @iTrimut 制作
预览分享卡片长什么样 ↓iTrimut/dsh-Webroad
分享 · DeepSeek Harness Hub
iTrimut/dsh-Webroad

扫码让手机连上本机 DSH,局域网公网都能用

这是你的仓库?认领条目

回到顶部