前言¶
讓模型操作遠程服務器,常見的做法有兩條:在目標機上部署 agent,或者把 shell 權限整體交給智能體。前者多一個常駐進程要維護,後者意味着一條高危命令可能在無人確認的情況下跑在生產機上。
dsh-remote-server 給出另一種組合:不往服務器上安裝任何東西,命令通過你現有的 ssh 客戶端執行,但每條命令都要經過一道固定順序的審批流水線——無法明確放行的一律落到人工,人工不可達則以拒絕收尾。
這是什麼¶
dsh-remote-server 是 DeepSeek Harness(下稱 DSH)的一款插件,作者是 MRZHUH,採用 MIT 許可,當前版本 0.1.1。DSH 的理念是「一切皆插件」,這款插件在會話中加入了 @ 提及能力:輸入 @ 列出已註冊的服務器,選定後引用隨消息傳遞,模型在每條命令上都會顯式寫出目標服務器。
官方的一句話定位:在 DSH 會話中用 @ 提及服務器,通過 SSH 在其上執行命令,所有命令置於一個 fail closed 的兩級審批門檻之後。
核心功能¶
不在服務器上裝任何東西¶
這是插件的核心設計,值得單獨一節:
- 目標機上無 agent、無 daemon、無入站端口。插件驅動你自己的 ssh 客戶端,現有
~/.ssh/config繼續生效——跳板機、agent forwarding、known_hosts都不用改。 - 身份驗證僅支持密鑰。
identityFile只是交給 SSH 客戶端打開的路徑,插件從不讀取、複製或存儲密鑰材料;password字段會被拒絕而不是存儲。 - 運行 dsh 的機器上需要有 OpenSSH 客戶端。如果缺少
ssh,插件會在加載時失敗並給出對應平臺的安裝命令,而不是掛載成一個什麼都跑不了的狀態。
註冊服務器¶
兩條路徑:
1、在 Settings -> Servers -> Add a server 中添加;
2、或寫入 remote-servers 設置命名空間(YAML)。
remote-servers:
servers:
- alias: web-01
host: 10.0.0.11
user: ops
tags: [prod, web]
description: edge tier - start here
- alias: db-01
host: db-01.internal.example
port: 2222
identityFile: ~/.ssh/id_ed25519_db
alias 是你在 @ 之後輸入的名字,不能包含空白字符;配置項包括 alias、host、user、tags、description,以及可選的 port、identityFile。
也可以直接導入現有配置:導入功能讀取 ~/.ssh/config(或你指定的路徑),列出主機供你選擇註冊;重新掃描時會提示哪些主機已經註冊過,而不是列出一排禁用的重複項。
如果服務器拒絕了你的密鑰,服務器頁面會給出一條填好你的用戶名、主機和端口的 ssh-copy-id 命令。
兩個工具與服務器信息頁¶
插件向模型暴露兩個工具:
| 工具 | 作用 |
|---|---|
remote_exec |
在單個已註冊服務器上運行一條命令,返回 stdout、stderr 和退出碼 |
remote_server_info |
讀取已採集的服務器信息,或重新探測機器 |
每個服務器有一頁信息:可達性、你寫的描述,以及主機自身的數據——hostname、OS、CPU、memory、disk、uptime,全部在單次 SSH 往返中採集。沒有檢查過的服務器會如實顯示未檢查,而不是給出佔位數字。頁面標題同時顯示已安裝的插件包版本。
審批流水線¶
每條命令都要經過一個固定順序的流水線,順序本身就是設計的一部分:
- 未註冊別名:直接拒絕,不發起連接。
- Full access:harness 的
danger-full-access與never權限組合下,已註冊服務器的命令不再二次提示。 - 高危規則集:確定性匹配命中即強制人工決策,模型分類器不能推翻。
alwaysAsk:設置後,從這裏往後的所有命令都交給人工。- 只讀 allowlist:命中已配置前綴的普通調用立即執行。
- 模型分類器:對剩下的命令回答 auto 或 human。
- 人工審批:通過 harness 審批通道詢問。
九類高危類別強制人工決策:遞歸刪除、磁盤與文件系統寫入、關機重啓、服務停止與重啓、用戶與權限變更、包安裝與卸載、寫入系統路徑、提權、讀取憑據或密鑰路徑。
fail closed 的含義是:任何無法給出明確放行的命令都落到人工;分類器超時、報錯或回答含糊都不算通過——拒絕分支是代碼裏的默認路徑,而不是錯誤處理分支。
開啓模型自動審批¶
自動審批默認關閉,直到你在配置裏指名模型——插件無法預知你的部署組合了哪個 provider。在 profile 的 cordis.patch.yml 中:
- id: remote-server
config:
classifier:
provider: deepseek
model: deepseek-chat
provider 與 model 要麼都設、要麼都不設,只設其一會在加載時失敗。這一步不涉及 API key:插件通過 ctx.llm 調用,憑據由 harness 解析,插件本身接觸不到密鑰。
安裝與啓用¶
從 npm 安裝:
dsh plugin --profile web add dsh-remote-server
然後照常啓動 dsh web(等同於 dsh --profile web)。--profile 指定裝入哪個組合:profile 是 $DSH_HOME/profiles/ 下的一套可啓動插件集合,可以讓日常環境和乾淨環境並存,web 是 quickstart 默認啓動的那套。發佈的 tarball 已構建,無需手動編輯或額外許可。
如果 PATH 上沒有 dsh 命令,可以用 npx 運行,或全局安裝:
npx @deepseek-ai/dsh web
# 或
npm install -g @deepseek-ai/dsh
注意保留完整的包名作用域:裸寫 npx dsh 會拉到一個無關的包,報 could not determine executable to run。
從源碼安裝:
dsh plugin --profile web add github:MRZHUH/dsh-remote-server
git 安裝拉取的是源碼而非構建產物,pnpm 需要運行這個包的 prepare 腳本來編譯。首次 add 會失敗,並打印需要加入 pnpm-workspace.yaml 的配置鍵(以 pnpm 實際輸出爲準,舊版 pnpm 中這個鍵叫 allowBuilds):
onlyBuiltDependencies:
- dsh-remote-server
允許這一條意味着允許該包在安裝時於你的機器上執行代碼,建議同時用 github:MRZHUH/dsh-remote-server#<sha> 固定 commit,避免後續 push 靜默改變所運行的內容。從 npm 安裝不需要這個許可,因爲發佈的 tarball 已經構建好。
安裝過程中出現的 missing peer 警告(@deepseek-ai/dsh-*、@deepseek-ai/cordis、react)屬預期行爲:這些 peer 由 dsh 安裝自身在運行時提供,不在 profile 的 node_modules 裏,插件可以正常工作。
卸載只需一條命令,已註冊的服務器會保留:
dsh plugin --profile web remove dsh-remote-server
配置項¶
已覈實的兩個配置項:connectTimeoutMs 默認 10000,約束建立連接的過程;execTimeoutMs 默認 120000。README 的配置表在此之後被截斷,其餘配置項以倉庫原文爲準。
典型用法¶
裝好插件、註冊一臺服務器之後,流程是這樣的:
1、會話中輸入 @,從列表中選定服務器;
2、用自然語言說出需求,引用隨消息傳遞,模型在每條命令上顯式寫出目標服務器;
3、只讀的命令立即執行;任何改變狀態的命令都會停下來先問你。
若希望分類器自動放行一部分命令,再按上文在 cordis.patch.yml 中配置 provider 和 model 即可,不配置則保持全部人工確認的默認行爲。
適用場景與注意¶
適合的場景:
- 已有一套 SSH 體系和
~/.ssh/config,想讓模型代跑遠程命令、又不想在目標機上引入 agent 的開發者與運維; - 需要「讀類命令立即執行、改狀態命令必須經人確認」這一默認策略的環境。
幾點注意:
1、插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與許可證(本項目爲 MIT)。從源碼安裝尤其要清楚:允許 prepare 腳本等於允許該包在安裝時執行代碼,建議固定 commit。
2、運行 dsh 的機器上需要有 OpenSSH 客戶端,缺失時插件會在加載時直接失敗。
3、發佈流程上,GitHub Release 標籤匹配 v<package.json version> 時觸發 .github/workflows/publish.yml,通過 npm trusted publishing 以 provenance 發佈,不使用 NPM_TOKEN secret。
結尾¶
dsh-remote-server 的價值在於把「讓模型碰服務器」的默認路徑從執行改成了拒絕:不裝 agent、不存密鑰,讀類命令走 allowlist 立即執行,九類高危強制人工,分類器拿不準就交給人。如果你的工作流裏模型和 SSH 已經密不可分,可以按上面的步驟試一遍。
- 目錄頁:https://www.skillhub.cn/plugins/MRZHUH/dsh-remote-server
- GitHub:https://github.com/MRZHUH/dsh-remote-server
注:skillhub.cn 爲獨立的社區插件目錄,與 DeepSeek / 幻方無官方從屬關係。