dsh ssh 怎么远程连接?DeepSeek Harness 远程运行理由与 DSH plugin 安全前提
严格说,dsh 里并没有 dsh ssh 这条子命令——大家说的「dsh ssh」,是指用 SSH 从本机连到跑着 dsh web 的服务器;因为 dsh web 默认只绑 127.0.0.1:3080,正确姿势是建 SSH 隧道,而不是把端口开到公网。
DeepSeek Harness 远程访问概览
本文聚焦两处:为什么要远程跑 dsh、以及远程访问的安全前提;SSH 隧道怎么建只留要点并指向部署旧文。 先把最容易误解的一点讲清:没有 dsh ssh 这个命令,SSH 是传输层动作,dsh 只负责在服务器上把服务跑起来。这套做法和「远程部署」是同一族问题的不同切面:部署讲怎么把服务在服务器上跑起来,本篇讲清「为什么要远程跑」和「为什么不能随便改绑定」,完整部署步骤对照《DeepSeek Harness 怎么部署到远程服务器》。
为什么要远程跑 dsh:服务器出算力,本机只当终端
把 dsh 放在服务器上跑、本机只当浏览器终端,动机主要有这么几个:算力与环境在服务器、工作区数据不出内网、无人值守常驻,以及多端看到同一套环境。 逐个看:
- 算力与环境在服务器 — 大仓库、构建工具链、本地模型都在服务器上,本机只需轻薄客户端。预期:重活集中在远端,本机不被拖慢。
- 数据不出内网 — 工作区文件留在服务器,本机只经隧道看结果。预期:敏感文件不必拷到本地。
- 无人值守常驻 — 配合终端复用器或系统服务,服务长期在线。预期:随时连上都能用,不必每次手动起。
- 多端看到同一套环境 — 服务器上一套 profile 与 DSH插件,桌面、笔记本、手机连上去共用同一份。预期:不必在每台设备上各配一遍,长任务也不会因换设备而中断。
- 无图形界面不是问题 — 服务端与浏览器本来就分开,纯服务器环境只打印地址。预期:不加
--no-open也不会去乱找浏览器,加了更干净。
换句话说,远程访问的价值不是「换个地方点界面」,而是把有状态、有权限的那部分留在受控机器上。
dsh ssh 怎么连:SSH 隧道与局域网的要点
受支持的连法只有一条:SSH 本地端口转发——ssh -L 3080:127.0.0.1:3080 <用户>@<服务器>,把服务器回环的 3080 映射到本机,再在本地浏览器打开服务器终端打印的那个带 ?token= 的地址(来源)。 因为 dsh web 默认绑 127.0.0.1 且不支持 --host 0.0.0.0,同网段直连也不在受支持范围内,局域网设备同样得走隧道。还有一条容易忽略的设计:启动环境里存在 SSH_CONNECTION 或 SSH_TTY 时,dsh web 会抑制默认浏览器的自动打开、只打印宿主机 URL,因为本地转发地址由 SSH 客户端或编辑器持有、服务端无从得知。服务器侧起服务、~/.ssh/config 固化 LocalForward、以及用 tmux 让进程常驻的完整步骤,已在《DeepSeek Harness 怎么部署到远程服务器》里逐条写清,这里不再重复。远程连进来之后要补插件,直接在界面里用 DSH Plugin Hub 的插件市场按分类挑就行,不必在隧道两端来回敲命令;手机等其它设备的接入与取舍见《DeepSeek Harness 手机端怎么用》。
dsh 远程访问的安全前提:别绑 0.0.0.0、令牌别外传
两条硬前提:不要把服务绑到 0.0.0.0、也不要把带令牌的地址随手转发出去(来源)。 为什么卡得这么死?因为 Web 应用能以 Host 用户的权限执行命令、读写本机文件,一旦匿名可达,就等于把一台机器的控制权交出去。按顺序检查:
- 不要用
--host 0.0.0.0暴露 — 它带着本机文件与命令执行能力,官方刻意拒绝这个用法。预期:服务始终只监听回环,外部无法直连。 - 要限制来源就用
--trusted-host— 向/api信任栅栏加入受信主机名,而不是把服务推向全网。预期:只有列出的主机名被信任。 - 令牌一次性、别外传 — 启动令牌只打印一次、重启即变。预期:从不把
?token=的地址贴进聊天或截图。 - 隧道用完即收 — 不用时断开 SSH 或重建。预期:本机映射端口失效,访问随之关闭。
- 批处理走无界面模式 — 只想跑任务就用
dsh --profile headless "任务"。预期:完全不暴露 Web 入口。 - 别用反向代理硬怼公网 — 官方没有为远程部署提供 TLS、转发 header 解释或代理配置支持,自行把 3080 推上公网已经超出受支持范围。预期:对外需求先评估风险,别默认它就是受支持的部署方式。
- 令牌别落进历史 — 带
?token=的地址会留在浏览器历史与 shell 历史里。预期:取到后立刻换成会话 cookie,别把它粘进 issue、聊天或截图。
一句话:认证解决的是「谁能在本机用」,不是「能不能开到公网」;这两者不能互相替代。 其它运行模式的适用边界见《dsh 运行模式怎么选》。
远程访问 DSH plugin 的注意事项与局限
- 没有
dsh ssh子命令 — 别去文档里找这个命令,SSH 是你在系统层做的动作,dsh只管起服务。 - 绑定地址不可改 —
127.0.0.1与拒绝--host 0.0.0.0是官方决策,任何绕过都超出受支持范围。 - 令牌每次启动都变 — 远程访问每次都要从服务器终端重新取一次带令牌的地址,无法预先收藏。
- 隧道断开即失去访问 — SSH 会话结束时转发失效,界面打不开不等于服务挂了。
- 数据目录要归属清楚 — 以哪个用户运行
dsh,就用哪个用户的$DSH_HOME,换用户运行等于换了一套配置与 DSH插件。 - 常驻要自己托管 — 官方未提供服务化方案,长期运行请用终端复用器或系统服务自行托管。
与其 SSH 进去后一遍遍手敲 dsh plugin add 装 DeepSeek插件、出问题还得在服务器上到处翻日志,不如在服务器侧用 DSH Plugin Hub:插件市场按分类挑,装、更新、卸载的每一步操作轨迹都会写进系统日志,省得在隧道两端来回比路径。

来源:dsh CLI README、dsh CLI behavior reference、DeepSeek Harness README(官方仓库)
常见问题
dsh ssh 不是 dsh 的子命令,而是大家对手动做法的简称:先在服务器上跑 dsh web,再在本机用 ssh -L 3080:127.0.0.1:3080 <用户>@<服务器> 建本地端口转发,然后在浏览器打开带令牌的地址。核心是 SSH 隧道,不是某个 dsh 的参数。
因为 dsh web 默认只绑 127.0.0.1:3080,这个地址只有服务器本机能访问,局域网其他机器和公网都连不上。正确做法不是改绑定,而是建 SSH 本地端口转发,把服务器回环的 3080 映射到本机,再在本地浏览器访问。
启动令牌是进程每次启动随机生成、只打印一次的凭据,拿去打开会把它换成会话 cookie 并跳到干净的根路径。它不持久化,重启后令牌就变,所以远程访问每次都要从服务器终端重新取一次带 ?token= 的地址,别把它收藏或转给别人。
不能。CLI 有意不支持 --host 0.0.0.0,传入会以用法错误退出,这是官方为了避免在没有 TLS 与代理约定的前提下暗示支持网络部署。想在局域网访问,同样用 SSH 隧道;要限制来源主机则用可重复的 --trusted-host 添加受信主机名。
无图形界面不影响运行,它只打印访问地址、不尝试打开浏览器。但 SSH 断开可能让前台进程退出,所以要常驻就用 tmux 或系统服务托管,并明确数据目录 $DSH_HOME 归属哪个用户;否则重新登录后进程早没了,隧道也白建。
相关术语
- SSH 本地端口转发
- SSH 本地端口转发是用 ssh -L 把本机某个端口映射到远端服务器回环地址的做法,让本机浏览器以为自己连的是本地端口,实际流量经加密隧道抵达服务器。— DeepSeek Harness README(官方仓库)
- --trusted-host
- --trusted-host 是 dsh web 可重复使用的参数,向 /api 浏览器信任栅栏加入受信主机名;它用于限制来源主机,不用于把服务暴露到网络。— dsh CLI behavior reference
- 启动令牌
- 启动令牌是 DeepSeek Harness 进程每次启动随机生成、只打印一次的凭据,访问带令牌的根 URL 会把它换成 host-only 会话 cookie,之后正常浏览。— dsh CLI behavior reference
- headless profile
- headless profile 是 DeepSeek Harness 内置的无界面运行模式,用 dsh --profile headless "任务" 跑一个全新会话并打印结果,完全不暴露 Web 入口。— dsh CLI README
来源
- dsh CLI README· deepseek-ai
- dsh CLI behavior reference· deepseek-ai
- DeepSeek Harness README(官方仓库)· deepseek-ai