前言¶
在 DeepSeek Harness(DSH)裏做運維或排查時,智能體往往只能改本地工作區,無法像你平時 ssh prod-web-1 那樣在真實主機上取證、執行命令或改配置。把密鑰和 ~/.ssh/config 交給模型又擔心誤刪、誤重啓。下面介紹的 dsh-remote(維護者 aide-family)把遠程 SSH 操作做成 DSH 插件:主機發現、遠程執行、SFTP 讀寫、持久 shell,並在每次可能改動的動作前做靜態命令風險審查與人類審批,思路來自同團隊的 Crescent 運維工作臺。
這是什麼¶
dsh-remote 是面向 DSH 的 SSH 遠程服務器操作插件。它在會話中讓智能體可以:列出你在 ~/.ssh/config(含 Include)裏已配置的主機、探測連通性、運行非交互命令、通過 SFTP 讀寫遠程文件、在工作區與服務器之間傳文件;對會改變系統狀態的命令,先經 Crescent 風格的靜態分類器審查,再通過 DSH 審批對話框由人放行。
運行環境要求:DSH >= 0.2.1-rc.5(Desktop 與 dsh CLI 已捆綁)、Node.js ^22.19.0 || >=24.0.0(DSH 已捆綁)。目標機需具備 SSH 訪問能力(密鑰、ssh-agent,或通過環境變量提供的密碼);插件會尊重 HostName、User、Port、IdentityFile、ProxyJump 等配置。
核心功能¶
主機與連接¶
- 自動發現
~/.ssh/config中的具體Host條目,並與插件配置裏的補充主機列表合併;模型按名稱引用主機,與ssh <name>一致。 - Remote Ops 管理頁爲 DSH Web GUI 一級面板:展示主機清單(每行可讀連接測試)、進行中的遠程 shell 會話(滾動預覽與關閉)、近期遠程操作審計。
- 主機管理器:在 Remote Ops 頁增刪改連接項,持久化在
$DSH_HOME/remote/hosts.json;認證信息只存環境變量名,不存明文密鑰。 - 主機行上的 審計 可查看該主機的命令與終端會話歷史;連接 可一鍵建會話、開新對話並掛上原生終端,把主機交給該對話裏的智能體。
遠程執行與文件¶
- remote exec:單次非交互命令,支持工作目錄、超時、輸出上限,結果帶
[exit code: N]。 - SFTP:按行號分頁讀取、列目錄、原子寫入(臨時文件 + rename)、精確字符串編輯、上傳/下載。
- 持久 remote shell(
remote_shell_*):交互 PTY,跨工具調用保持;提交每一行與remote_exec一樣做風險審查。
終端與可視化¶
- 對話右側 Remote Terminal 標籤:智能體執行的遠程命令實時鏡像 stdout/stderr 與狀態行,首次遠程命令時自動打開。
- 遠程終端 面板:選擇主機後通過本地中繼 attach DSH 原生 xterm,關閉標籤可重連同一會話,SSH 斷線自動 backoff 重連。
- 主機列表 複製連接命令:原生終端不可用時仍可複製等價 shell 命令。
安全與策略¶
- 命令風險審查:靜態分類器區分只讀(
low)、明確變更(high)、未知(gray);理解 shell 列表、sudo/env/nohup等包裝、sh -c/ssh/kubectl exec內層、find -delete、sed -i、docker/kubectl/systemctl子命令及引號。 - 審批策略
policy:auto(只讀直接跑、變更需審批)、always、never(無審批則 fail-closed)。默認下僅分類器能證明爲 mutating 的命令才彈審批;只讀與無法證明但非 mutating 的命令(如curl、awk)可直接執行;readonlyHosts、allowHosts、denyCommandPatterns等更嚴規則仍生效。 - 硬限制:單主機只讀鎖、主機白名單、命令 deny 模式、輸出/傳輸上限、TOFU 主機密鑰校驗(
knownHostsPolicy: tofu | strict | insecure)。
安裝與啓用¶
插件當前版本 0.5.2(MIT)。從 npm 安裝(發佈後):
dsh plugin --profile desktop add dsh-remote --ignore-scripts
本地開發包可用 tarball 安裝(README 示例版本號與倉庫一致):
npm run pack:plugin
dsh plugin --profile desktop add file:$PWD/dist/dsh-remote-0.5.2.tgz --ignore-scripts
使用 pnpm 11 時必須加 --ignore-scripts,以避免 ssh2 可選原生構建腳本觸發工具鏈要求;純 JS 實現可正常工作。不要用 link: 指向倉庫外目錄安裝開發檢出,DSH 無法正確解析 @deepseek-ai/* 依賴。
安裝完成後完全退出並重啓 DSH Desktop(或重啓你安裝到的 CLI profile),新 bundle 纔會加載。卸載:
dsh plugin --profile desktop remove dsh-remote
配置要點¶
設置在 profile 補丁里插件行 dsh-remote 的 config 下。Desktop 默認補丁路徑爲 ~/.dsh/profiles/desktop/cordis.patch.yml;無頭或 CI 可用 --patch 覆蓋。
- id: dsh-remote
config:
hosts:
- name: prod-web-1
host: 10.0.0.11
port: 22
username: ops
identityFile: ~/.ssh/prod_ed25519
tags: [prod, web]
description: primary web node
- name: legacy-db
host: 10.0.0.31
username: dba
passwordEnv: LEGACY_DB_SSH_PASSWORD
policy: auto
readonlyHosts: ["prod-*"]
allowHosts: []
denyCommandPatterns: ["\\b(shutdown|reboot|mkfs)\\b"]
connectTimeoutMs: 20000
execTimeoutMs: 120000
maxOutputBytes: 200000
maxReadBytes: 800000
maxTransferBytes: 52428800
knownHostsPolicy: tofu
unprovenCommands: allow
hosts 中勿寫明文密碼,只寫持有密碼的環境變量名(如 passwordEnv)。readonlyHosts 匹配的主機拒絕一切 mutating 操作;allowHosts 爲空表示不限制,非空則僅匹配主機可用。
典型用法(工作流)¶
- 安裝插件並重啓 DSH,確認本機
~/.ssh/config或補丁里hosts已有所需主機名。 - 在 Remote Ops 頁對目標主機做連接測試;需要時在 GUI 增刪主機或設置
readonlyHosts/denyCommandPatterns。 - 在對話中讓智能體按主機名執行只讀命令(如
uname -a、讀日誌);變更類命令會彈出審批,通過後執行並在右側 Remote Terminal 看到流式輸出。 - 需要人工操作時打開 遠程終端 面板選主機,或在主機列表點 連接 開專屬對話;審計頁可事後覈對命令與會話記錄。
具體工具名與參數以插件在會話中註冊的 DSH tools 爲準,行爲與 README 中 remote_exec、SFTP、remote_shell_* 描述一致。
適用場景與注意¶
適合已在 DSH 裏用智能體做遠程排查、批量只讀巡檢、在審批下執行有限變更的場景;與現有 SSH 配置和 jump 拓撲兼容,不必 duplicate 一套主機清單(仍可 YAML 補充未寫入 config 的主機)。
插件以當前 DSH 進程的用戶權限運行,能讀到的密鑰、能連的主機與你在本機用 SSH 的能力一致;安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認策略字段符合組織安全要求。社區目錄 SkillHub 插件頁 與 DeepSeek / 幻方無官方從屬關係,僅作發現與鏈接用途。
結尾¶
dsh-remote 把「按主機名、一次一個邊界動作、變更前審查與審批」落到 DSH 插件裏,並補上 GUI 主機管理、實時終端鏡像與審計。進一步瞭解與安裝說明見 SkillHub 目錄頁 與 GitHub:aide-family/dsh-remote。