DeepSeek Harness 在 WSL2 里安装:DSH plugin 路径、浏览器联动与端口转发
WSL2 里装 DeepSeek Harness 的第一件事不是敲命令,而是决定「装哪一侧」——因为它决定了你的 DSH plugin 能操作哪些文件、dsh web 给谁看、以及后来所有路径问题长什么样。 三种玩法都成立:只装 WSL 侧(处理 Linux 项目最顺)、只装 Windows 侧(处理 Windows 项目、WSL 只当工具链)、两侧都装(各自独立、互不干扰)。真正容易踩的是三处:路径互操作(/mnt/c 的跨文件系统代价、Windows 反斜杠路径被 Markdown 转义吃掉)、浏览器联动(WSL 的端口转发什么时候会失效)、以及跨系统挂载带来的文件属主差异让插件写文件失败。
DeepSeek Harness 装哪一侧:WSL 侧与 Windows 侧的三种玩法
一句话结论:别问「WSL 能不能装 DeepSeek Harness」,要问「你要它操作哪一侧的文件」——按文件在哪决定装在哪,混装只会带来两套互不相通的环境。
| 玩法 | 适合 | 优势 | 代价 |
|---|---|---|---|
| A. 只装 WSL 侧 | 项目在 Linux 文件系统里、要跑 Linux 工具链 | 文件 IO 最快、插件与 shell 行为一致 | Windows 侧资源(如 Windows 专属工具)用不上 |
| B. 只装 Windows 侧 + WSL 当工具链 | 项目在 Windows 盘上 | 直接用 Windows 的资源与桌面端 | 操作 /mnt/c 时的性能损耗由 WSL 侧承担 |
| C. 两侧都装 | 两种项目都要处理 | 各干各的、互不影响 | 两套数据目录、两套已装 DSH plugin、两套凭据——升级与排查都要做两遍 |
方案 A:只装 WSL 侧(最常用)
一句话结论:在 WSL 里用 npm 全局装 @deepseek-ai/dsh、把 DSH_HOME 放在 WSL 原生文件系统里、起 dsh web 后由 Windows 浏览器经本机转发访问——这是 Linux 项目最顺的一条路。
- 用 nvm 装 Node(避免
sudo npm -g带来的权限问题):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
nvm install 20 && nvm use 20 && node -v
- 全局安装 DeepSeek Harness 本体:
npm i -g @deepseek-ai/dsh
dsh --version # 预期:打印版本号
- 把数据目录固定在 WSL 原生盘(放
/home下,别放/mnt/c):
export DSH_HOME="$HOME/.dsh" # 建议写进 ~/.bashrc 持久化
mkdir -p "$DSH_HOME"
- 起
dsh web(参数名以dsh web --help为准):
dsh web --port 3080
# 预期:WSL 内 curl -I http://127.0.0.1:3080 有响应
- 在 Windows 浏览器打开
http://127.0.0.1:3080(WSL2 本机转发默认生效,见第 5 节)。
方案 B:装 Windows 侧 + 工作区走 /mnt/c
一句话结论:DeepSeek Harness 装在 Windows 侧、项目也在 Windows 盘上,WSL 只作为你的 shell——这样文件 IO 走 Windows 原生路径,代价是 WSL 侧命令看到的路径是 /mnt/c/...,引用要转换。
- Windows 侧安装:在 Windows 终端里
npm i -g @deepseek-ai/dsh,用dsh --version验证。 - 工作区用 Windows 路径加入;插件操作的是 Windows 盘上的文件,性能与属主都正常。
- 要跨到 WSL 侧时用
\\wsl$\<发行版>\home\...(资源管理器)或/mnt/...(WSL 侧命令)—— 别在 Windows 程序里写 Linux 风格路径,反之亦然。 - 取舍提醒:这条玩法下你失去了「Linux 工具链一致性」——同一条插件命令在两侧表现可能不同(shell、路径分隔符、权限模型都不一样)。
方案 C:两侧都装(各自独立)
一句话结论:两侧都装完全可行,关键是从头就把两套环境当两个独立的机器**——各自一份 DSH_HOME、各自一份插件清单;任何「一边装了另一边怎么没有」的疑问,答案都是「它们本来就不共享」。**
- 两侧分别设
DSH_HOME,并且不要把同一个卷/目录同时给两侧用(跨系统并发写同一份数据容易产生状态不一致)。 - 插件各装各的:在 WSL 侧装的是给 WSL 环境用的,Windows 侧的插件操作 Windows 文件。装了哪个、什么版本,用 DSH Plugin Hub 的已装列表逐侧核对,比在两边命令行里对清单快。
- 升级也要做两遍:两侧版本漂移是常态,见 多台机器统一更新 DeepSeek Harness。
- 别共享凭据文件:两侧的品牌与账号体系独立,凭据格式也会有版本差异,强行共享会直接启动失败。

DSH plugin 与 Windows 的路径互操作:WSL2 三种写法与取舍
一句话结论:路径问题只有一条原则——谁执行、用谁的路径风格;而性能问题只有一条原则——项目放 WSL 原生盘,跨系统只放必须跨的产物。
| 写法 | 用在哪 | 特点 |
|---|---|---|
/mnt/c/Users/you/project | WSL 侧命令访问 Windows 盘 | 可用但慢(跨文件系统,大目录扫描尤其明显) |
/home/you/project | WSL 侧原生 | 最快,建议项目落这里 |
C:\Users\you\project | Windows 侧程序 | Windows 侧正常;在 Markdown 里会被当转义,吃掉一级分隔符 |
\\wsl$\Ubuntu\home\you | Windows 侧访问 WSL 文件 | 资源管理器可用,批量操作慢 |
- 遇到「路径明明存在却打不开」,先看它在哪一侧执行、用的是哪种风格(跨系统时最常见的是把
C:\塞给了 WSL 侧命令)。 - 遇到「图片/附件预览 404」,优先怀疑反斜杠转义把路径写坏了——优先改用正斜杠,这类问题在 Windows 路径被 Markdown 吃掉 有更细的现场。
让 Windows 浏览器打开 WSL 里的 DSH plugin 网页端:三条路
一句话结论:默认靠 WSL2 本机转发就能用 127.0.0.1 打开;转发失效时按「显式绑定 → 用 WSL IP → 手动端口转发」三步退,而不是去改鉴权设置。
- 路一:本机转发(默认,优先用)。WSL2 会把 WSL 内监听的端口映射到 Windows 本机,直接在 Windows 浏览器访问
http://127.0.0.1:3080。 - 路二:显式绑定 + 用 WSL IP 访问(转发失效时的退路):
dsh web --host 0.0.0.0 --port 3080 # WSL 侧
ip addr show eth0 | grep "inet " # 查 WSL 的 IP
# 然后在 Windows 浏览器访问 http://<WSL的IP>:3080
- 路三:重建 WSL 网络,让转发重新生效:
wsl --shutdown后重新进入发行版——本机转发会在实例重建后刷新,这是最省事的一招。 - 还打不开再查防火墙:Windows 防火墙或第三方安全软件会拦非常规端口,临时放行该端口验证一次即可定位。
- 反过来也要会查:如果 WSL 内
curl都不通,问题就在dsh web本身(端口被占/权限),与转发无关(见 DeepSeek Harness 端口冲突排查)。
WSL 里跑 DSH plugin 的前提与 DSH插件 排查注意事项
一句话结论:插件在 WSL 里与原生 Linux 行为一致,所以失败几乎都集中在「Node 装法(权限)」与「原生模块(编译)」两处;跨系统挂载再叠一层属主差异。
- 全局安装权限:用 nvm 管理的 Node 装全局包不需要 sudo;如果报
EACCES,改用 nvm 而不是sudo npm -g(后者会把文件属主写成 root,后续升级更麻烦)。 - 原生模块编译:
sudo apt-get install -y build-essential python3之后再装;纯 JS 插件不受影响。 - 文件属主差异:插件在
/mnt/c下写文件可能失败或属主错乱——把需要频繁写入的目录放到 WSL 原生盘。 - 环境变量与 shell:
DSH_HOME之类变量要写进~/.bashrc,否则新开的 shell 又回到默认数据目录,表现为「插件列表突然空了」。 - 两侧清理与卸载:WSL 侧的卸载与 容器 / CI 环境里的清理 思路相同——先记录已装清单,再删数据目录。
- 修复状态如实:本文命令基于官方 CLI 包与 WSL 官方网络文档;
dsh web的具体参数名以你机器上的--help输出为准,Windows 侧与 WSL 侧的差异行为可能随版本变化。
来源:apps/cli/README.md、README.zh.md、Microsoft Learn · WSL networking。
常见问题
取决于你要让 DeepSeek Harness 操作哪些文件:让它处理 WSL 里的 Linux 项目就装在 WSL 侧,处理 Windows 盘上的项目就装在 Windows 侧并用 WSL 做辅助。两侧都装也完全可行,但它们是两套独立环境——两边的数据目录、已装 DSH plugin 清单与凭据互不相同,别指望一边装另一边能用。
在 DeepSeek Harness 里,WSL2 默认会做本机到 Windows 的端口转发,正常情况下在 Windows 里访问 127.0.0.1 对应的端口就能打开 dsh web。打不开一般是三种原因:服务只监听回环之外没生效、WSL 的端口转发失效(重启 WSL 或 wsl --shutdown 后重建)、Windows 防火墙拦了该端口。排查顺序是先确认服务本身在 WSL 内 curl 得通,再看转发。
在 DeepSeek Harness 里,因为 /mnt/c 是跨文件系统访问,WSL2 走的是网络式文件协议而不是原生磁盘 IO,大量小文件读写会慢一个量级。DeepSeek Harness 的文件工具与插件在扫描、读取、写入时都会放大这个差距。项目代码放 WSL 原生文件系统(/home 下)、只有必须跨系统访问的产物放 /mnt/c,是最省事的取舍。
在 DeepSeek Harness 里,在 WSL 侧执行命令时用 Linux 风格路径(/mnt/c/Users/...),在 Windows 侧程序里用 Windows 风格路径(C:\Users\...),两者不要混写。特别提醒:Windows 反斜杠路径在 Markdown 里会被当成转义字符吃掉一级分隔符,导致引用失效——跨系统传路径时优先用正斜杠或让工具自己解析。
DeepSeek Harness 的插件在 WSL 里安装与在原生 Linux 一致,常见两类失败:一是全局安装目录没权限(改用 nvm 管理的 Node,或用 sudo 装到系统目录);二是插件依赖原生模块需要编译(先装 build-essential 与 python3)。跨系统挂载目录还会带来文件属主差异,插件写文件失败时优先怀疑这一条。
相关术语
- WSL2 本机转发
- WSL2 本机转发是 WSL2 提供的网络特性:在 WSL 里监听的端口会自动映射到 Windows 本机,使 Windows 侧用 127.0.0.1 就能访问。它默认开启,但会因 WSL 实例重启或休眠而失效。— https://learn.microsoft.com/windows/wsl/networking
- 跨文件系统访问(/mnt/c)
- 跨文件系统访问指 WSL 通过挂载点访问 Windows 盘符的路径,读写经由协议转发而非原生磁盘 IO,因此大量小文件操作明显变慢。DeepSeek Harness 的项目目录放在哪一侧,直接决定文件工具与插件的速度。— https://learn.microsoft.com/windows/wsl/networking
- DSH_HOME
- DSH_HOME 是 DeepSeek Harness 指定数据目录的环境变量,profile 配置、已装 DSH plugin 记录、会话与凭据都在其中。WSL 侧与 Windows 侧各有一份独立的 DSH_HOME,这是「两边互不相通」的根源。— https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/README.md
- dsh web
- dsh web 是 DeepSeek Harness 的网页端入口,把会话与插件管理能力以本地网页服务的形式提供。在 WSL 里启动时它监听的是 WSL 网络命名空间,需要经由本机转发或显式绑定才能被 Windows 侧访问。— https://www.npmjs.com/package/@deepseek-ai/dsh
来源
- deepseek-ai/deepseek-harness — apps/cli/README.md(CLI 安装、profile 启动与插件管理)· deepseek-ai(GitHub)
- deepseek-ai/deepseek-harness — README.zh.md(项目入口与运行形态)· deepseek-ai(GitHub)
- Microsoft Learn — Accessing network applications with WSL(localhost 转发与端口转发)· Microsoft