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

代理中心 scclovez/dsh-tun-proxy

DeepSeek Harness
scclovez18 天前有提交已提供中文文档扫描:含敏感能力

管理订阅节点与 TUN 全局代理,一键切换出口

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add scclovez/dsh-tun-proxy
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/11/04·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 18 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 127 处,展示前 83 条)
  • 读取本地文件
    lib/core/service.js:28
    if (!existsSync(file)) return fallback
  • 读取本地文件
    lib/core/service.js:30
    return JSON.parse(readFileSync(file, 'utf8').replace(/^ FEFF/u, ''))
  • 写入本地文件
    lib/core/service.js:38
    mkdirSync(join(file, '..'), { recursive: true })
  • 写入本地文件
    lib/core/service.js:40
    writeFileSync(temp, `${JSON.stringify(value, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/core/service.js:41
    renameSync(temp, file)
  • 读取本地文件
    lib/core/service.js:45
    if (!existsSync(file)) return ''
  • 读取本地文件
    lib/core/service.js:48
    const info = statSync(file)
  • 写入本地文件
    lib/core/service.js:82
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    lib/core/service.js:88
    if (!existsSync(paths.settingsFile)) {
  • 删除本地文件
    lib/core/service.js:102
    if (next.subscriptionUrl !== current.subscriptionUrl) rmSync(paths.subscriptionFile, { force: true })
  • 读取本地文件
    lib/core/service.js:139
    if (!existsSync(settings.profilePath)) throw new Error(`profilePath 不存在:${settings.profilePath}`)
  • 写入本地文件
    lib/core/service.js:155
    mkdirSync(paths.profiles, { recursive: true })
  • 写入本地文件
    lib/core/service.js:156
    writeFileSync(paths.subscriptionFile, text, 'utf8')
  • 执行外部命令来自配置/变量
    lib/core/service.js:347
    const child = spawn(kernelBin, args, {
  • 删除本地文件
    lib/core/service.js:848
    rmSync(file, { force: true })
  • 删除本地文件递归
    lib/core/service.js:854
    rmSync(paths.home, { recursive: true, force: true })
  • 删除本地文件
    lib/core/service.js:857
    rmSync(paths.configFile, { force: true })
  • 读取本地文件
    lib/routes.js:120
    response.end(readFileSync(new URL(file, import.meta.url), 'utf8'))
  • 读取本地文件
    lib/core/paths.js:26
    while (!existsSync(parent) && dirname(parent) !== parent) { tail.unshift(basename(parent)); parent = dirname(parent) }
  • 读取本地文件
    lib/core/settings.js:267
    if (!existsSync(settingsFile)) return normalizeSettings({ ...SETTINGS_DEFAULTS, ...fallback })
  • 读取本地文件
    lib/core/settings.js:270
    raw = JSON.parse(readFileSync(settingsFile, 'utf8').replace(/^ FEFF/u, ''))
  • 写入本地文件
    lib/core/settings.js:285
    mkdirSync(dirname(settingsFile), { recursive: true })
  • 写入本地文件
    lib/core/settings.js:287
    writeFileSync(temp, `${JSON.stringify(settings, null, 2)}\n`, 'utf8')
  • 写入本地文件
    lib/core/settings.js:288
    renameSync(temp, settingsFile)
  • 发起网络请求
    lib/core/net.js:88
    const response = await fetch(url, {
  • 发起网络请求
    lib/core/net.js:177
    const response = await fetch(url, {
  • 删除本地文件
    lib/core/kernel.js:107
    rmSync(destination, { force: true })
  • 执行外部命令来自配置/变量
    lib/core/kernel.js:184
    execFile(kernelPath, args, { timeout: timeoutMs, windowsHide: true, cwd, maxBuffer: 4 * 1024 * 1024 }, (error, stdout, stderr) => {
  • 读取本地文件
    lib/core/kernel.js:194
    if (!existsSync(kernelPath)) return ''
  • 读取本地文件
    lib/core/kernel.js:197
    const info = statSync(kernelPath)
  • 写入本地文件
    lib/core/kernel.js:213
    mkdirSync(destination, { recursive: true })
  • 执行外部命令固定命令
    lib/core/kernel.js:216
    execFile('tar.exe', ['-xf', zipPath, '-C', destination], { windowsHide: true, timeout: 180000 }, (error, _stdout, stderr) => {
  • 读取本地文件
    lib/core/kernel.js:245
    entries = readdirSync(dir, { withFileTypes: true })
  • 写入本地文件
    lib/core/kernel.js:309
    mkdirSync(paths.bin, { recursive: true })
  • 写入本地文件
    lib/core/kernel.js:310
    mkdirSync(paths.cache, { recursive: true })
  • 读取本地文件
    lib/core/kernel.js:312
    if (!existsSync(settings.kernelPath)) throw new Error(`kernelPath 不存在:${settings.kernelPath}`)
  • 读取本地文件
    lib/core/kernel.js:341
    if (!force && existsSync(paths.kernel) && explicit === '') {
  • 删除本地文件
    lib/core/kernel.js:369
    rmSync(zipPath, { force: true })
  • 删除本地文件递归
    lib/core/kernel.js:391
    rmSync(extractDir, { recursive: true, force: true })
  • 删除本地文件
    lib/core/kernel.js:392
    rmSync(staged, { force: true })
  • 读取本地文件
    lib/core/kernel.js:407
    ? { sha256: sha256File(binary), size: statSync(binary).size, expected: '' }
  • 写入本地文件
    lib/core/kernel.js:415
    renameSync(binary, staged)
  • 删除本地文件递归
    lib/core/kernel.js:434
    rmSync(extractDir, { recursive: true, force: true })
  • 删除本地文件
    lib/core/kernel.js:435
    rmSync(zipPath, { force: true })
  • 写入本地文件
    lib/core/kernel.js:511
    mkdirSync(dirname(paths.wintun), { recursive: true })
  • 写入本地文件
    lib/core/kernel.js:517
    copyFileSync(candidate, staged)
  • 执行外部命令来自配置/变量
    lib/core/ps.js:25
    execFile(file, args, { timeout: timeoutMs, windowsHide: true, maxBuffer, encoding: raw ? 'buffer' : 'utf8' }, (error, stdout, stderr) => {
  • 执行外部命令来自配置/变量
    lib/core/ps.js:46
    execFile(
  • 执行外部命令来自配置/变量
    lib/core/ps.js:63
    return execFileSync(PS, ['-NoProfile', '-NonInteractive', '-Command', "$ErrorActionPreference='Stop'; " + script], { windowsHide: true, timeout: timeo
  • 执行外部命令固定命令
    lib/core/ps.js:322
    const stdout = execFileSync('tasklist.exe', ['/fi', `imagename eq ${imageName}`, '/fo', 'csv', '/nh'], { windowsHide: true, timeout: 5000, encoding: '
  • 执行外部命令固定命令
    lib/core/ps.js:340
    execFileSync('taskkill.exe', ['/PID', String(pid), '/T', '/F'], { windowsHide: true, timeout: 8000, stdio: 'ignore' })
  • 读取本地文件
    lib/core/profile.js:14
    if (!existsSync(file)) throw new Error(`节点提供者 ${name} 的文件不存在`)
  • 读取本地文件
    lib/core/profile.js:15
    text = readFileSync(file, 'utf8')
  • 读取本地文件
    lib/core/profile.js:17
    if (!refresh && existsSync(cache)) text = readFileSync(cache, 'utf8')
  • 读取本地文件
    lib/core/profile.js:17
    if (!refresh && existsSync(cache)) text = readFileSync(cache, 'utf8')
  • 写入本地文件
    lib/core/profile.js:23
    writeFileSync(cache, text, 'utf8')
  • 读取本地文件
    lib/core/profile.js:25
    if (existsSync(cache)) text = readFileSync(cache, 'utf8')
  • 读取本地文件
    lib/core/profile.js:25
    if (existsSync(cache)) text = readFileSync(cache, 'utf8')
  • 读取本地文件
    lib/core/profiles.js:12
    if (!existsSync(manifest)) return []
  • 读取本地文件
    lib/core/profiles.js:13
    const value = JSON.parse(readFileSync(manifest, 'utf8'))
  • 写入本地文件
    lib/core/profiles.js:18
    mkdirSync(paths.profiles, { recursive: true })
  • 写入本地文件
    lib/core/profiles.js:19
    writeFileSync(manifest + '.tmp', JSON.stringify(items, null, 2))
  • 写入本地文件
    lib/core/profiles.js:20
    renameSync(manifest + '.tmp', manifest)
  • 写入本地文件
    lib/core/profiles.js:55
    mkdirSync(paths.profiles, { recursive: true })
  • 写入本地文件
    lib/core/profiles.js:56
    writeFileSync(target + '.tmp', text)
  • 写入本地文件
    lib/core/profiles.js:57
    renameSync(target + '.tmp', target)
  • 读取本地文件
    lib/core/profiles.js:73
    writeFileSync(file(item.id) + '.previous', readFileSync(file(item.id)))
  • 读取本地文件
    lib/core/profiles.js:84
    writeFileSync(file(id) + '.previous', readFileSync(file(id)))
  • 读取本地文件
    lib/core/profiles.js:103
    writeFileSync(file(id) + '.previous', readFileSync(file(id)))
  • 删除本地文件
    lib/core/profiles.js:115
    for (const suffix of ['', '.previous', '.previous-meta.json']) rmSync(file(id) + suffix, { force: true })
  • 读取本地文件
    lib/core/profiles.js:134
    if (!existsSync(target + '.previous') || !existsSync(target + '.previous-meta.json')) return false
  • 删除本地文件
    lib/core/profiles.js:138
    for (const suffix of ['.previous', '.previous-meta.json']) rmSync(target + suffix, { force: true })
  • 读取本地文件
    lib/core/artifacts.js:103
    if (!existsSync(file)) {
  • 读取本地文件
    lib/core/artifacts.js:106
    const size = statSync(file).size
  • 读取本地文件
    lib/core/artifacts.js:136
    const hadPrevious = existsSync(targetFile)
  • 读取本地文件
    lib/core/artifacts.js:137
    if (existsSync(backup)) throw new Error(`Unfinished replacement: preserve ${backup} and recover it before retrying`)
  • 写入本地文件
    lib/core/artifacts.js:140
    renameSync(targetFile, backup)
  • 写入本地文件
    lib/core/artifacts.js:147
    renameSync(sourceFile, targetFile)
  • 写入本地文件
    lib/core/artifacts.js:152
    renameSync(backup, targetFile)
  • 删除本地文件
    lib/core/artifacts.js:167
    if (hadPrevious) rmSync(backup, { force: true })
  • 删除本地文件
    lib/core/artifacts.js:173
    rmSync(targetFile, { force: true })
  • 读取本地文件
    lib/core/artifacts.js:174
    if (hadPrevious && existsSync(backup)) renameSync(backup, targetFile)
  • 写入本地文件
    lib/core/artifacts.js:174
    if (hadPrevious && existsSync(backup)) renameSync(backup, targetFile)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh@deepseek-ai/dsh-typert-protocol
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 代理中心:独立 mihomo 内核、订阅节点、全局 TUN、系统代理与多跳链式代理。

README

由 DeepSeek 最新模型翻译生成
DSH 代理中心 DSH 内的独立 mihomo 客户端。 0.3.1 的下载校验、依赖来源及 Windows 验证范围见审查证据。商城复核尚待固定新提交和补齐文档中的验收项。 English · Windows x64 · DSH ≥ 0.2.0-rc.2 · Node.js ≥ 22.19 - 多订阅:导入、切换、更新、流量配额、定时更新、编辑。 - 代理:策略组、节点选择、搜索、排序、批量测速。 - 连接:实时速率、流量趋势、连接列表、单独/全部断开。 - 规则:运行规则、自定义前置规则。 - 链式:2–8 跳 TCP 代理。 - 系统:TUN、Windows 系统代理、DNS、IPv6、自动启动、关 DSH 时自动停代理(可选)。 - 维护:日志、内核更新、本地备份与恢复。 - 检测:一键查询当前出口 IP、地区与所属节点(经本机混合端口发出,反映真实出口)。 - 界面:继承 DSH 主题及玻璃配色。
展开完整文档(README 剩余 1 节)
DSH 代理中心

DSH 内的独立 mihomo 客户端。

0.3.1 的下载校验、依赖来源及 Windows 验证范围见审查证据。商城复核尚待固定新提交和补齐文档中的验收项。

English · Windows x64 · DSH ≥ 0.2.0-rc.2 · Node.js ≥ 22.19

- 多订阅:导入、切换、更新、流量配额、定时更新、编辑。
- 代理:策略组、节点选择、搜索、排序、批量测速。
- 连接:实时速率、流量趋势、连接列表、单独/全部断开。
- 规则:运行规则、自定义前置规则。
- 链式:2–8 跳 TCP 代理。
- 系统:TUN、Windows 系统代理、DNS、IPv6、自动启动、关 DSH 时自动停代理(可选)。
- 维护:日志、内核更新、本地备份与恢复。
- 检测:一键查询当前出口 IP、地区与所属节点(经本机混合端口发出,反映真实出口)。
- 界面:继承 DSH 主题及玻璃配色。

安装

~~~powershell
git clone https://github.com/scclovez/dsh-tun-proxy.git
cd dsh-tun-proxy
powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/install.ps1

重启 DSH,在左侧打开“代理中心”。TUN 需要管理员权限。

面板“概览 → 连接”里的 “关 DSH 时关代理” 开关(设置项 stopOnExit,默认关闭):打开后,正常退出 DSH 或停用本插件时会停止内核并尝试恢复系统代理。强杀 DSH 无法触发退出钩子,内核可能继续在后台运行;可用面板或 node scripts/cli.mjs stop 停止本插件所属内核。

测试

~~~powershell
$env:DSH_TEST_KERNEL = 'C:\path\to\mihomo.exe'
node --test
node scripts/acceptance-tun.mjs

默认混合端口 17890。状态保存在 %USERPROFILE%\.dsh\tun-proxy。

参考 FlClash 的功能组织(03f9553,GPL-3.0,仅功能参考,未包含其代码),插件代码独立实现。

许可证

本项目自身代码使用 MIT 协议,版权归 scclovez 所有。

本包不分发任何第三方二进制:mihomo 内核(GPL-3.0)与 Wintun wintun.dll(WireGuard LLC 预编译二进制许可)都由 tun_proxy_install 在运行时下载到用户自己的 %DSH_HOME%\tun-proxy。
各自协议、义务与维护者注意事项见 THIRD_PARTY_NOTICES.md。
预览分享卡片长什么样 ↓scclovez/dsh-tun-proxy
分享 · DeepSeek Harness Hub
scclovez/dsh-tun-proxy

管理订阅节点与 TUN 全局代理,一键切换出口

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部