dsh-plugin-autosshfs: Bring sshfs mounting into the Harness interface and provide the Agent with a tool of the same name.

前言

团队里常见这样的情况:Agent 要在本地跑构建、跑测试,代码和数据却放在远端机器上。传统做法是手动 sshfs 挂载一次,把路径写进文档,从此每台新机器、每个新 profile 都要重来一遍;命令行工具(如 nrs-tools/lib/autosshfs.js)能批量挂载,但没有界面,状态不直观,也没法让 Agent 安全地操作。

下面介绍 shudingbo/dsh-plugin-autosshfs。它是 DeepSeek Harness 的客户端插件,维护者 shudingbo,把 autosshfs 的 sshfs 挂载 / 卸载能力做成 Harness 主界面里的独立管理页,同时以 autosshfs 工具把同一套逻辑暴露给 Agent。社区目录把它归在「客户端」分类,当前星标为 0。插件纯 JavaScript,MIT 许可,package.json 版本 1.0.3。

这是什么

一句话定位:在 Linux / macOS 上用 sshfs 挂载、卸载远端目录,界面上点按钮操作,Agent 侧也能调用。

几个关键点:

  • 入口是左侧栏的全局面板按钮,和「插件」「自动化任务」同一排。点击后在主界面打开独立页面,不是设置弹窗。
  • 配置文件沿用命令行版的 ~/.autosshfs.json,位置和格式都不变。已经用命令行版攒下的配置可以直接复用。
  • 所有操作(列表、状态、增删改、挂载 / 卸载、依赖检测)界面和 Agent 工具共用同一套逻辑,不存在「界面能做、工具做不到」的落差。

核心功能

界面与 Agent 工具 autosshfs 的能力一一对应:

功能 界面 Agent 工具
查看所有配置项与实时挂载状态 支持 action: "state"
新增 / 编辑 / 删除配置项 支持 add / update / remove
启用 / 停用单项 支持 enable
挂载 / 卸载单项 支持 mount / umount + name
全部挂载 / 全部卸载 支持 mount / umount(不带 name)
查看单项详情(挂载来源、挂载选项等) 支持 detail
系统依赖检测与自动安装 支持 check(install 仅限界面)

界面侧补充几点:顶栏有标题、sshfs 版本徽标、已挂载/总数 徽标和配置文件路径;顶部有依赖提示条;列表页支持按名称 / 主机 / 挂载点搜索和全部 / 已启用 / 已挂载筛选;点击「详情」就地展开挂载来源、文件系统、挂载选项和认证方式。界面中英双语,随 Harness 语言切换。

install 这个动作刻意只放在界面上,避免 Agent 擅自改动机器权限。

相对命令行版的两处加固

README 明确写了两点改动,值得单独说:

  1. 不再拼接 shell 字符串。所有命令以 argv 数组直接执行,主机名、路径、密码里的任何字符都不会被 shell 解释。使用 password 字段的场景下这点尤其重要。
  2. 挂载状态按挂载表精确匹配挂载点。Linux 读 /proc/self/mounts,macOS 解析 mount,替掉了原来在 mount 输出里做 includes(path) 的子串比较。/mnt/a 不会再被误判成 /mnt/ab 已挂载。

另外,配置写入采用「临时文件 + rename」的原子写,文件权限固定 0600,因为配置里可能存着密码。

安装与启用

插件是基于 dsh.bundle.patch + dsh.client 的 Harness bundle,没有构建步骤,index.js / client.js / host/ 就是可直接运行的源码。

方式一:从 GitHub 安装

在 Harness 会话里执行:

plugin_manager(action: "install_bundle", target: "github:shudingbo/dsh-plugin-autosshfs")

也可以把同一串 github:shudingbo/dsh-plugin-autosshfs 粘贴到 Harness Web 界面「插件 → 添加插件」的安装框里。安装结果里出现 application: applied 表示已生效。

底层是 pnpm 的 git 依赖,所以本质上等同于:

cd ~/.dsh/profiles/<profile>
pnpm add github:shudingbo/dsh-plugin-autosshfs

方式二:从本地目录安装

用于开发调试:

git clone git@github.com:shudingbo/dsh-plugin-autosshfs.git
plugin_manager(action: "install_bundle", target: "/绝对路径/dsh-plugin-autosshfs")

方式零:从 npm 安装

README 标注的方式零是发布到 npm 后可用的方式,只有它能享受插件页的「检查更新 / 一键升级」:

plugin_manager(action: "install_bundle", target: "@shudingbo/dsh-plugin-autosshfs")

安装之后

左侧栏点击 Autosshfs 挂载 面板按钮,主界面切换到独立管理页。不想让它常驻一行时,点该行右侧的固定按钮,它会收进「更多」菜单,再点固定即可放回。Agent 此时可以直接调用 autosshfs 工具。卸载用:

plugin_manager(action: "remove_bundle", target: "@shudingbo/dsh-plugin-autosshfs")

典型用法

安装完成后,Agent 侧的调用示例如下:

// 列出现状
{ "action": "state" }
// 挂载全部启用的配置
{ "action": "mount" }
// 只挂载某一项
{ "action": "mount", "name": "project" }
// 新增配置
{ "action": "add", "entry": { "name": "p", "host": "h", "user": "me", "remotePath": "/srv", "mount": "/mnt/p" } }
// 修改(只传要改的字段,password 省略 = 保持,传 "" = 清除)
{ "action": "update", "name": "p", "entry": { "allowOther": false } }
// 同名项可改用位置定位
{ "action": "detail", "index": 4 }
// 查看依赖问题
{ "action": "check" }

返回值是 JSON:{ ok, action, data | error, summary },error.code 和结果项的 code 是稳定标识,hint / command 给出下一步可执行动作。

界面上的操作顺序一般是:先在「新增挂载」里填好连接信息和挂载选项,再用开关或按钮手动挂载;之后任何一次「全部挂载」都会跳过 enable 为 false 的项。

配置与挂载选项

默认配置路径 ~/.autosshfs.json,可用环境变量 AUTOSSHFS_CONFIG 覆盖,两者都支持 ~ 展开。结构示例:

{
  "list": [
    {
      "enable": true,
      "name": "project",
      "host": "example.com",
      "port": 22,
      "user": "me",
      "password": "",
      "IdentityFile": "~/.ssh/id_ed25519",
      "remotePath": "/srv/project",
      "mount": "/mnt/project",
      "allowOther": true,
      "uid": "1000",
      "gid": "1000",
      "extraOptions": ["reconnect", "ServerAliveInterval=15"]
    }
  ]
}

常用字段:

  • name:界面与工具按它定位配置项,新建时校验唯一性。历史配置若存在同名项,界面按「位置 + 名称」定位。
  • host / port / user:SSH 目标,user 为空时使用当前本地用户。
  • password:可选,存在时用 -o password_stdin 通过 stdin 传入。明文保存在配置文件中,不建议长期使用,优先 IdentityFile 或 ssh-agent。
  • IdentityFile:私钥路径,支持 ~/。
  • remotePath:远端目录。
  • mount:本地挂载点,绝对路径,不存在会自动创建。
  • enable:是否参与「全部挂载」,缺省视为 false。
  • allowOther:是否附加 allow_other,默认 true。
  • uid / gid:透传 uid= / gid=。
  • extraOptions:额外 -o 选项,数组或以逗号 / 空格分隔的字符串。

未识别的字段在保存时会原样保留,方便手工扩展。

系统依赖

插件会在「使用帮助 → 系统依赖」里显示依赖状态。Linux 上若检测到包管理器且 sudo -n 可用,页面上的「自动安装」按钮可直接安装,否则展示需要手动执行的命令。

Linux 各发行版安装命令:

# Debian / Ubuntu
sudo apt-get install -y sshfs
# Fedora / RHEL
sudo dnf install -y fuse-sshfs
# Arch
sudo pacman -S --noconfirm sshfs
# openSUSE
sudo zypper --non-interactive install sshfs
# Alpine
sudo apk add sshfs

非 root 用户使用 allow_other 前,需要在 /etc/fuse.conf 中启用 user_allow_other:

sudo sed -i 's/^#\s*user_allow_other/user_allow_other/' /etc/fuse.conf

容器内还要把 /dev/fuse 传入容器,并确保 FUSE 内核模块可用(sudo modprobe fuse)。

macOS 上 Homebrew 已不再提供官方 sshfs 公式,需要自行选一套 FUSE 实现:

# 方案 A:FUSE-T(无需内核扩展)
brew tap macos-fuse-t/homebrew-cask
brew install --cask fuse-t
brew install fuse-t-sshfs

# 方案 B:macFUSE(内核扩展,需重启并在「系统设置 → 隐私与安全性」中允许)
brew install --cask macfuse
brew install gromgit/fuse/sshfs-mac

macOS 的 allow_other 需先在 FUSE 提供方设置里允许其他用户,否则插件会自动退回不带 allow_other 的挂载方式并给出警告,此时只有当前用户能访问挂载点。

适用场景与注意

适合的场景:Linux / macOS 上的 DSH 使用者,已经有命令行版 autosshfs 配置想平移到界面和 Agent;需要在 Agent 工作流里按需挂载远端目录,而不是每次手动执行 shell。

几条限制需要提前知道:

  • 插件以当前 DSH 进程的权限运行,挂载、卸载、依赖安装都直接作用在本机。安装前先读一遍源码,确认 host/sshfs.js、host/config.js 里的实现符合预期;许可证是 MIT,作者 shudingbo。
  • 只支持 Linux 与 macOS,Windows 不支持。
  • 从 GitHub 安装的插件没有「检查更新」入口,DSH 本身也没有后台自动更新。更新方式是先卸载再安装,让 git 依赖重新解析默认分支的最新提交:
plugin_manager(action: "remove_bundle",  target: "@shudingbo/dsh-plugin-autosshfs")
plugin_manager(action: "install_bundle", target: "github:shudingbo/dsh-plugin-autosshfs")

想控制升级节奏,可以固定到 tag 或提交,例如 github:shudingbo/dsh-plugin-autosshfs#v1.0.1。已安装的包不能直接用 install_bundle 覆盖,带 HMR 的 profile 会抛 already-installed,所以升级一律先卸载再安装。本地 link: 安装是例外,改动即生效。

小结

这个插件做的事不复杂:把 sshfs 挂载管理从命令行搬进 Harness 主界面,同时以 autosshfs 工具暴露同一套操作。配置格式沿用 ~/.autosshfs.json,命令行版的存量配置直接可用;argv 执行和挂载点精确匹配两处加固降低了使用 password 和相似路径时的风险。适合想在 Agent 工作流中按需挂载远端目录、又不希望每次都手工敲 sshfs 的人。

目录页:https://www.skillhub.cn/plugins/shudingbo/dsh-plugin-autosshfs
GitHub:https://github.com/shudingbo/dsh-plugin-autosshfs

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye