mcpField
M
mcp-ssh-manager

mcp-ssh-manager

本地服务
github.com/bvisible云与基础设施5252 天前更新

关于 mcp-ssh-manager

mcp-ssh-manager 是面向希望监看并审批 Agent 操作的团队的 SSH MCP 服务。工具涵盖命令、文件、备份、健康检查和数据库操作,并提供可选控制界面与审计记录。

主要功能

  1. 01通过 SSH 执行命令和传输文件
  2. 02创建数据库备份并检查服务器健康状况
  3. 03按服务器设置请求审批
  4. 04查看命令输出与审计记录
  5. 05通过桌面或浏览器界面管理连接

适用场景

  1. 01检查生产服务器的资源使用情况
  2. 02部署前备份数据库
  3. 03在监督下部署文件并重启服务
  4. 04批量检查一组服务器

MCP 相关

该 MCP 服务向 MCP 客户端提供基于 SSH 的工具,涵盖命令、文件操作、数据库查询、备份、健康检查和隧道。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"bvisible-mcp-ssh-manager": {
"command": "npx",
"args": [
"-y",
"mcp-ssh-manager"
],
"env": {
"SSH_CONFIG_PATH": "<SSH_CONFIG_PATH>",
"SSH_ENV_PATH": "<SSH_ENV_PATH>"
}
}
}
}
启动命令npx -y mcp-ssh-manager
需要配置的环境变量
SSH_CONFIG_PATHPath to a TOML file holding the server definitions. Defaults to ~/.codex/ssh-config.toml. Each server can set MODE to readonly or restricted to constrain what the agent may run.
SSH_ENV_PATHPath to a .env file declaring servers as SSH_SERVER_<NAME>_HOST, _USER, _KEYPATH and friends. Defaults to a .env next to the package.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmmcp-ssh-manager4.0.1

工具

37

收录的工具列表 · 更新于 2 天前

参数类型必填说明
cwdstring否工作目录(可选;如已配置则使用默认值)
serverstring是配置中的服务器名称
commandstring是要执行的命令
timeoutnumber否命令超时时间,单位为毫秒(默认值:120000,最大值:300000)

详细介绍

README 配图

SSH Manager

给你的 Agent 一个 shell,
看看它们会用它做什么。

一个用于 SSH 的 MCP 服务。让 Claude Code、Claude Desktop 和 OpenAI Codex(或任何 MCP 客户端)
在你的真实服务器上工作——运行命令、传输文件、查询数据库、创建备份、检查运行状况——
你可以在一旁看着它们操作。

npm version npm downloads Version Claude Code OpenAI Codex MCP OpenSSF Scorecard OpenSSF Best Practices License

Agent 请求在生产环境运行 rm -rf;请求被拒绝;实时命令持续输出结果;逐一探测所有服务器的运行状况

未经剪辑的 20 秒片段——观看完整尺寸版本。真实 SSH、真实 SFTP,环回地址上的三个临时主机。


一句话说清问题

MCP SSH 服务是你能交给 Agent 的最危险工具:它能在重要机器上打开 shell。如今,Agent 在生产环境运行了什么,你只能事后才知道——如果你能知道的话。

**这个工具让你可以看着操作,也可以说不。**而在平常的日子里,它也只是让助手帮你处理服务器工作的一种非常好用的方式,而这些工作原本你打算亲自完成。

选择你的工作区

桌面应用(4.0.1): 一次安装,即可使用独立的运行时、 终端、文件浏览器和服务设置。无需单独安装 Node.js 或 npm。 下载:

平台文件签名
macOS,Apple 芯片 / Intel…-arm64.dmg / …-x64.dmg由 Apple 签名并公证 — 可正常打开
Windows x64 / arm64…-setup.exe4.0.x 版本未进行代码签名。 Windows 会显示 “Windows 已保护你的电脑”:点击 更多信息 → 仍要运行。请将文件与该版本发布页中的 release-manifest-win32.json 所列 SHA-256 值进行核对(ssh-manager app 会为你完成核对)。后续版本将进行签名。
Linux x64.deb、.AppImage未签名,Linux 软件包通常如此

已经在使用 npm / CLI? 执行 npm update -g mcp-ssh-manager 即可升级到 4.0.1, V4 引擎无需界面即可运行,使用你现有的 .env、TOML 或 进程变量 — 不会自动导入,不会强制启动向导,也不会要求确认, 除非你为某个服务启用了确认。唯一收紧的行为是 SSH 主机密钥验证;升级前请阅读 升级和回滚指南中的相关部分。若暂时要留在 3.8, 请锁定版本:npm install -g mcp-ssh-manager@3。

一步从引擎切换到应用。 安装 V4 引擎后, ssh-manager app 会下载与引擎版本相同的桌面应用, 并根据发布信息进行核验(发布清单中的文件大小和 SHA-256 值,以及 macOS 上的 Apple 签名和公证),然后安装并打开应用 — 如果应用已存在,则只会 打开它。ssh-manager control 的浏览器界面也提供同样的一键操作。你的 Agent 继续使用 npm 引擎;应用则是运行在它之上的窗口。除非你主动请求,否则不会下载任何内容。

完全不使用 npm。 应用也内置了引擎,你的 AI 工具可以启动这个引擎:选项 → AI 工具会列出 Claude Code、Claude Desktop 和 Codex,显示每个工具启动的是哪个 ssh-manager(npm 版、应用版,或尚未配置),并可一键切换 — 无需 Node,也无需终端。同一个选项卡在 ssh-manager control 中会向 npm 用户显示每个工具实际运行的版本。 切换时会重写该工具中的那条 ssh-manager 配置项,保留其环境变量,并在工具下次启动时生效;切回去也只需点击一次。

更新。 应用会在启动时以及每六小时检查一次新版本,并在你能看到的地方提示你:侧边栏上的标记、选项 → 更新(当前运行版本、可用版本、立即检查按钮、发行说明),以及每个版本一次的通知。点击即可下载,再点击一次即可安装(重启以更新),也可以在退出时安装。npm 引擎通过 npm 更新,更新安排由 npm 决定。界面变更会随下一次 npm 发布提供给 npm 用户,随下一次应用发布提供给应用用户。

使用 npm 启动

npm install -g mcp-ssh-manager     # or: brew tap bvisible/mcp-ssh-manager https://github.com/bvisible/mcp-ssh-manager && brew install ssh-manager

ssh-manager server add             # guided: host, user, key or password
claude mcp add ssh-manager mcp-ssh-manager

就这样。重启 Claude Code,然后问它一个问题。

使用 Codex、源代码检出,或项目级安装?

OpenAI Codex — 安装方式相同,然后配置两个文件。在 ~/.codex/config.toml 中:

[mcp_servers.ssh-manager]
command = "mcp-ssh-manager"
env = { SSH_CONFIG_PATH = "/Users/you/.codex/ssh-config.toml" }
startup_timeout_ms = 20000

然后在 ~/.codex/ssh-config.toml 中配置你的服务:

[ssh_servers.production]
host = "prod.example.com"
user = "admin"
key_path = "~/.ssh/id_rsa"
default_dir = "/var/www"
group = "production"

以下所有内容在 Codex 中的用法都完全相同 — 同样的 37 个工具,同样的配置字段。

从源代码安装:

git clone https://github.com/bvisible/mcp-ssh-manager.git
cd mcp-ssh-manager && npm install
cd cli && ./install.sh
claude mcp add ssh-manager node /absolute/path/to/mcp-ssh-manager/src/index.js

MCP 引擎无需构建。从检出目录使用界面(ssh-manager control),需先构建一次:npm run build:ui(已发布的软件包和桌面应用已包含该界面)。

作用范围 — --scope project 会写入团队可提交的 .mcp.json;--scope user 会为你在所有地方启用它。

先决条件 — Node 18+,支持 Linux、macOS 或 Windows。运行 ssh_sync 需要 rsync;仅在使用密码验证进行同步时才需要 sshpass(brew install hudochenkov/sshpass/sshpass,或 apt-get install sshpass)。


直接开口就行

无需学习语法。你的助手已经知道如何使用这 37 个工具;你只需用自己的话告诉它。

你说会发生什么
“为什么生产环境现在这么慢?”一次往返就能获取 CPU、内存、磁盘、负载均值和占用资源最多的进程
“部署前先备份数据库。”生成带时间戳的压缩 MySQL/PostgreSQL/MongoDB 转储,并按保留策略管理
“持续查看 staging 上的 nginx 错误日志。”实时流式输出,日志一产生就会显示
“把 ./dist 推送到 production:/var/www,然后重启 nginx。”先传输文件,再重启服务;同时处理所有权、权限和回滚副本
“我的哪些服务磁盘快满了?”并行检查组内的每台服务
“打开一条通往生产数据库的隧道。”建立本地端口转发,让你的 GUI 客户端直接连接
“在所有标记为 production 的服务上运行 docker ps。”在整个组内运行同一条命令,可按顺序或并行执行

ssh-manager 命令行主屏幕:菜单上方显示版本、服务数量、配置文件和桌面应用状态

也提供命令行工具,方便你亲自操作:不带参数运行 ssh-manager 即可打开此界面。


旁观操作过程——控制平面

4.0.0 新增。 应用采用可选启用模式:如果未启用保险库和审批功能,引擎会继续以无头模式运行,与 3.8.x 完全一致。有关主机密钥验证和恢复行为,请参阅迁移指南。

ssh-manager control          # prints a local URL — or `ssh-manager app` for the desktop app

同一套功能,两种外壳。运行 ssh-manager control,即可在浏览器标签页中使用完整界面,无需安装任何额外内容;macOS、Windows 和 Linux 桌面版本则是在同一页面中内置引擎,因此既不需要 Node,也不需要 npm 包。

桌面版本还增加了浏览器标签页无法提供的两项功能:

  • 常驻菜单栏。 有事项待处理时,图标会显示数量;菜单会列出需要你处理的阻塞事项、当前打开的 Shell 和命令,以及你的服务。因此,“有没有事情等我处理?”只需扫一眼,无须切换窗口。关闭窗口后,应用仍会驻留,而不会退出。
  • 发送真正的系统通知,并使用应用自身的标识,让 macOS 和 Windows 正确显示和路由通知。具有破坏性的请求会一直显示在屏幕上,不会在 4 秒后淡出。macOS 首次需要发送通知时会请求你的许可。

在浏览器标签页中的界面,由 ssh-manager control 提供

### 在运行前拦截

等待界面:Agent 发起的破坏性命令,以及“拒绝”和“批准”选项

Agent 会暂停并等待。你可以完整看到机器、用户、工具和命令——内容会自动换行,绝不截断,因为只显示半条命令可能会让你批准错误的操作。有请求等待处理时,桌面应用会发出通知,因为看不见的请求最终会超时并被拒绝。

你只能在界面中为每个服务分别启用审批,而不是通过文件启用:

Servers → the server → Approval → never (default) | destructive | always

审批设置存储在保险库中,无法通过 .env 或进程变量覆盖。编辑连接详情不会影响该设置。这可防止意外的配置覆盖关闭审批门禁;但它并非安全边界,无法抵御已控制你本地用户帐户或保险库文件的进程。如果你曾在文件中设置 SSH_SERVER_*_APPROVAL,引擎会在每次启动时提示你,而不会悄悄让你失去保护。

destructive 列表刻意保持简短。频繁误报的提示会让人不看内容就直接点击,这比完全不提示更糟糕:systemctl restart 不会中断你的工作,而 systemctl stop 会。

请求需要审批时,如果发生超时、套接字无法访问或控制平面断开连接,请求都会被拒绝。如果没有任何程序在监听,请先启动 ssh-manager control 或桌面应用,再重试。禁用了审批的服务仍可在无界面模式下运行。

实时查看运行情况

实时界面:仍在运行的命令已展开,显示其彩色输出

输出会经过终端模拟器,而不是放在 <pre> 标签中——Agent 运行命令的显示效果与你亲自输入时完全一致,包括颜色。每个输出流都会保留有上限的滚动记录,因此在命令执行期间打开界面,也能看到此前的内容,而不是空白画面。

这里的任何内容都不会写入磁盘。 输出流可能包含机密信息,例如通过 cat 输出的配置文件,或部署脚本回显的令牌。因此,内容只保存在内存中,容量设有上限,并会在窗口关闭时消失。

并排查看两个文件系统

文件浏览器:左侧是这台机器,右侧是远程服务

将文件拖到另一侧,即可通过控制平面在本机与远程服务之间直接传输。浏览器不会暂存文件数据——这样传输速度更快,也只有这样才能传输数 GB 的文件。

按需查看运行状况

运行状况界面:每台服务的 CPU、内存和磁盘用量,其中一项已超过阈值

后台不会执行任何探测。 每次检查都需要进行 SSH 握手,而定时连接所有生产环境机器的仪表盘还不如没有仪表盘。检查策略完全由你通过按钮控制。阈值由你设定;超过阈值时,界面会用文字说明,而不是仅靠颜色表示。

任意机器上的 Shell

终端页面:选择一台机器以打开 Shell,或管理那些你总要重复输入的命令

选择一台机器,即可获得一个 Shell——与 Agent 使用的 Shell 相同,而且可以直接用键盘操作。既适用于常见场景,也适用于大家最常问的那个场景:直接在服务器上运行 Agent,而不是让 Agent 连接服务器。

包括这台机器。 桌面应用也能在你自己的电脑上打开 Shell,使用你的登录 Shell 以及其中配置的一切,因此你不必切换到另一个窗口来运行同一项任务的本地部分。你可以在任意组合的机器上打开任意多个 Shell:每个 Shell 都会显示为顶部的一个标签页和侧栏中的一项;切换离开后,它仍会继续运行。

此外,还可以保存那些你不想重复输入的命令,按服务器单独保存或供所有服务器共用,并在任意 Shell 中通过列表选择。

以及其他功能

服务器页面:按类别分组的卡片

同一页面还提供:任意服务器上的交互式 Shell、通过列表选择而非重复输入的已保存命令、可对一组服务器运行同一命令的分组、Agent 执行过的操作及你的决定的审计记录,以及已知主机密钥。

上方所有截图均为桌面版;每张截图在 docs/images/ 中都有对应的浏览器版。有关已实现和未实现的功能,请参阅 ROADMAP-V4.md。


默认安全

其他 SSH MCP 服务会把 Shell 交给 Agent,然后听天由命。这个服务则假定你希望对它的操作有所掌控。

按服务器决定权限范围
模式Agent 可以执行的操作
unrestricted (默认)所有操作。与其他 SSH MCP 服务一样,不增加任何开销。
readonly直接拒绝修改类工具——不能部署、上传、使用 sudo 或导入数据库。读取操作仍可执行。
restricted每条命令都必须匹配某个允许模式,且不能匹配任何拒绝模式。其他命令在到达主机前都会被拒绝。
SSH_SERVER_PROD_MODE=readonly
SSH_SERVER_STAGING_MODE=restricted
SSH_SERVER_STAGING_ALLOW_PATTERNS=^systemctl (status|restart) myapp$;^tail -n \d+ /var/log/
SSH_SERVER_PROD_AUDIT_LOG=~/.ssh-manager/audit.jsonl

这是 Claude Code 的 autoApprove 之下的第二层防护。autoApprove 对每个工具只能全批或全不批:一旦批准 ssh_execute,就可以执行任何操作。当你与第三方 Agent、CI 机器人共用 MCP,或在客户的机器上工作时,这一层很有用。完整参考请见 docs/SECURITY_MODES.md。

凭据不再明文存放于 .env
ssh-manager vault import      # take what you already have, encrypted
ssh-manager vault list        # see it, without ever printing a secret
ssh-manager vault add prod    # add one interactively
ssh-manager vault backup FILE # a copy that survives a new machine

采用 AES-256-GCM 加密,主密钥存放在操作系统密钥链中(若没有密钥链,则存放在 0600 权限的文件中——适用于 Windows、CI 和容器)。只有机密的值会被加密:主机、用户和模式仍保持可读,因此文件仍可供检查和比较差异。GCM 带有身份验证,因此保险库遭到篡改时会明确报错,而不会将错误的密码交给生产服务器。

密钥属于这台机器。 复制到新笔记本电脑上的保险库只是无法解密的密文——vault backup 会使用你选择的密码短语加密并写入副本,让迁移成为可能。你的 .env 永远不会被修改,无论是通过 import 还是通过界面;设置一部分在其中、一部分在保险库中是正常状态,并非故障。升级本身不会改变任何内容:请参阅 docs/MIGRATION.md。

不起眼却最容易出问题的部分
  • 你的 sudo 密码不会进入远程命令行。 它通过 SSH 通道的 stdin 传输,因此不会出现在 ps、/proc/<pid>/cmdline 或 auditd 日志中——不同于此类工具中常见的 echo "$pass" | sudo -S 模式(#34)。
  • 所有 shell 参数都会通过一个集中式辅助函数加引号,并通过一项测试将 340 种构建器 × 参数 × 负载组合交由真实 shell 执行,以证明其中任何内容都不会被执行。
  • 只读 SQL 是强制执行的,不是建议。 ssh_db_query 会拒绝任何非 SELECT 语句。
  • 漏洞会公开,而不会被掩盖。 SECURITY.md 说明了报告流程,并列出了所有已修复的安全公告——包括 v3.8.6 中的 6 个漏洞,其中包括一个命令注入漏洞:任何与服务器连接的 SSH 服务都可能触发该漏洞,进而在运行 MCP 服务的机器上执行命令。
  • 可复现的安装。 锁文件已提交,CI 使用 npm ci 安装,并且有一项测试确保每个依赖项都从 registry.npmjs.org 获取,带有完整性哈希,且不包含未经审核的安装脚本。

常见问题

我可以让 AI Agent 安全地通过 SSH 连接到我的服务器吗? 可以,前提是你决定它可以执行哪些操作。你可以针对每台服务器将其设为只读、仅允许符合某种模式的命令,或在控制平面中批准每个请求(或仅批准具有破坏性的请求)后再执行;凭据可以存放在加密保险库中,而不是明文 .env 文件中;并且每条命令和每项决策都会记录在日志中。参见默认安全。

如何通过 SSH 使用 Claude Code 或 Codex? 运行 npm install -g mcp-ssh-manager,使用 ssh-manager server add 添加服务器,然后运行 claude mcp add ssh-manager mcp-ssh-manager。Codex 的设置说明在此。然后用日常语言提问:“为什么生产环境运行缓慢?”、“查看 staging 上的 nginx 错误日志”。

它支持 Cursor、Windsurf、Cline 或其他 MCP 客户端吗? 这是一个标准的 stdio MCP 服务,因此任何 MCP 客户端都可以运行它。本文档记录并测试了 Claude Code、Claude Desktop 和 Codex。对于其他客户端,只需添加它所需的配置,例如:

{ "mcpServers": { "ssh-manager": { "command": "npx", "args": ["-y", "mcp-ssh-manager"] } } }

我需要 Node.js 吗? 如果使用 npm,需要(Node 18 或更高版本)。桌面应用自带运行时和引擎:安装后,从 Options → AI tools 连接你的 AI 工具,无需 Node,也无需 npm。

它与其他 SSH MCP 服务有什么不同? 大多数服务会把 shell 交给 Agent。这个服务允许你针对每台服务器选择 Agent 可以执行哪些操作,可以在你批准前暂缓请求,会保留审计记录,并提供桌面应用和浏览器界面供你查看所有信息。如果你希望如此,也可以完全不使用这些功能,直接将它作为一个通过 .env 或 TOML 文件配置的纯引擎运行。

我的密码和密钥存放在哪里? 密钥文件仍留在原处。保存的密码和口令短语可以存入加密保险库(采用 AES-256-GCM 加密,密钥存放在操作系统的钥匙串中),而不是存入 .env 文件。

它免费吗? 是的,采用 MIT 许可证。源代码在此,软件包发布在 npm,桌面应用可在发布页面获取。


参考

全部 37 个工具

核心 — 始终启用

工具功能
ssh_list_servers列出所有已配置的服务器及其分组和模式
ssh_execute运行命令。未指定 cwd 时,使用服务器的 DEFAULT_DIR
ssh_upload / ssh_download双向传输单个文件
ssh_sync双向 rsync,并显示实际传输数量

备份与恢复(v2.1+)

工具功能
ssh_backup_createMySQL、PostgreSQL、MongoDB 或文件 — 压缩备份,并包含元数据和保留策略
ssh_backup_list列出所有可用备份,以及大小、日期和保留策略
ssh_backup_restore还原单个备份,也支持跨数据库还原
ssh_backup_schedule加入 cron 定时任务,并自动清理

请参阅备份指南和 examples/backup-workflow.md。

健康状况与监控(v2.2+)

工具功能
ssh_health_checkCPU、内存、磁盘、网络、运行时间、负载 — 并给出总体评估
ssh_service_status查看 systemd 或 sysv 上的 nginx、mysql、docker 等服务
ssh_process_manager列出、检查或终止进程;按 CPU 或内存排序
ssh_alert_setup设置阈值,以及超出阈值时的处理方式
ssh_monitor, ssh_tail实时资源监控和日志跟踪

数据库(v2.3+)

工具功能
ssh_db_dumpMySQL、PostgreSQL、MongoDB;可选 gzip 压缩、可选表子集
ssh_db_import导入转储文件,自动处理 .gz 文件
ssh_db_list列出数据库,或其中的表
ssh_db_query仅限 SELECT — 强制执行,而非仅作建议

部署与会话

工具功能
ssh_deploy部署文件,并处理权限、备份和重启 — 请参阅部署指南
ssh_execute_sudo使用 sudo,密码通过 stdin 传入,而非放在命令行中
ssh_session_*持久化 Shell,可在命令之间保留上下文
ssh_tunnel_*本地、远程和 SOCKS 转发

组织管理

工具功能
ssh_alias为服务器设置短名称
ssh_command_alias为经常重复输入的命令设置短名称
ssh_group_*, ssh_execute_group在多台机器上执行同一项操作
ssh_hooks围绕 SSH 操作设置自动化钩子 — 请参阅别名与钩子
ssh_profile切换整套别名和钩子 — default、frappe、docker、nodejs 或自定义配置
减少上下文占用 — 工具组

全部 37 个工具大约占用 43.5k tokens 的上下文。大多数人用不着全部工具。

ssh-manager tools configure     # interactive wizard
ssh-manager tools list          # what's on right now
ssh-manager tools enable monitoring
ssh-manager tools disable backup
模式工具数上下文适用场景
全部 (默认)37~43.5k完整工具集
最小5~3.5k仅用 SSH,并省下 92% 的上下文
自定义5–37不定按实际需要选择

工具组:core(5 个,始终启用)· sessions(4 个)· monitoring(6 个)· backup(4 个)· database(4 个)· advanced(14 个)。

工具更少,也意味着更少的审批提示和更快的启动速度。ssh-manager tools export-claude 会生成相应的自动审批配置块。

📖 完整指南 →

从其他地方导入服务器

没人是从零开始的。你可能有包含 40 个主机的 ~/.ssh/config、FileZilla 站点管理器,或同事发来的电子表格。

ssh-manager import ~/.ssh/config          # the format is worked out for you
ssh-manager import --from transmit        # or read where a tool keeps its list
ssh-manager import --template servers.xlsx   # or get a form to fill in
来源方法
电子表格(.xlsx)--template 会生成一份表格,填好列名并附上三个示例供你替换
CSV支持逗号或分号分隔 — Excel 会根据所在地区使用其中一种
~/.ssh/config支持 Host、HostName、User、Port、IdentityFile、ProxyJump。跳过通配符,多个别名合并为一台服务器
FileZillasitemanager.xml。仅支持 SFTP 站点 — FTP 书签不是 SSH 服务器
PuTTY导出的 .reg 文件。若使用 .ppk 密钥则会拒绝导入,并提示用于转换密钥的 puttygen 命令
TermiusJSON 导出文件,包含分组
MobaXterm.mxtsessions,文件夹名会作为分组
Transmit直接读取其收藏夹(macOS)
**导入采用追加方式。** 已有名称会返回“已配置 — 保持不变”,绝不会静默覆盖;如果你确实想覆盖,请使用 `--replace`。两个同名条目会变成 `web` 和 `web_2`,而不是合并为一个。

绝不会读取密码。 FileZilla 会将密码以 base64 编码保存,Transmit 将密码存放在钥匙串中,PuTTY 则完全不保存密码。从其他应用的存储中复制凭据并非帮忙——这会把你早已忘记的秘密放到第二个地方,让你现在也必须记得它。主机、用户名、端口和密钥路径都会导入;你会在首次连接时被要求输入一次密码。

反向操作:

ssh-manager export servers.xlsx     # or .csv, .env, .toml

导出的内容不包含密码、密码短语或 sudo 密码——导出文件会被人们通过电子邮件互相发送,也可能被不小心提交到版本库中。

配置 — 每个字段

两种可互换的格式由同一个加载器读取:.env 通常与 Claude Code 搭配使用,TOML 则与 Codex 搭配使用(从 SSH_CONFIG_PATH 或 ~/.codex/ssh-config.toml 读取)。两者可以共存,加载器会将它们合并。

SSH_SERVER_[NAME]_HOST=hostname_or_ip
SSH_SERVER_[NAME]_USER=username
SSH_SERVER_[NAME]_PASSWORD=password          # or use a key
SSH_SERVER_[NAME]_KEYPATH=~/.ssh/key
SSH_SERVER_[NAME]_CERTPATH=~/.ssh/key-cert.pub # optional: OpenSSH certificate for KEYPATH
SSH_SERVER_[NAME]_PASSPHRASE=key_passphrase  # optional
SSH_SERVER_[NAME]_PORT=22                    # optional
SSH_SERVER_[NAME]_DEFAULT_DIR=/var/www       # optional working directory
SSH_SERVER_[NAME]_SUDO_PASSWORD=…            # optional, for automated deploys
SSH_SERVER_[NAME]_DESCRIPTION=…              # optional
SSH_SERVER_[NAME]_GROUP=production           # optional, free-form label
SSH_SERVER_[NAME]_PLATFORM=windows           # optional: linux (default) | windows
SSH_SERVER_[NAME]_PROXYJUMP=bastion          # optional: another server, as jump host
SSH_SERVER_[NAME]_PROXYCOMMAND=…             # optional: ncat, ssh -W, …
SSH_SERVER_[NAME]_FORWARD_AGENT=true         # optional, and a real security trade-off
SSH_SERVER_[NAME]_ANNOUNCE_AGENT=true        # optional: tell this host an AI agent is driving (off by default)
SSH_SERVER_[NAME]_MODE=readonly              # optional: unrestricted | readonly | restricted
# Approval is NOT a field here — it is set per server from the control plane and
# stored in the vault, so that a shell on one of your machines cannot switch off
# the gate that exists to stop it.
SSH_SERVER_[NAME]_AUDIT_LOG=~/audit.jsonl    # optional JSONL trail

对应的 TOML 写法:

[ssh_servers.production]
host = "prod.example.com"
user = "admin"
key_path = "~/.ssh/id_rsa"
port = 22
default_dir = "/var/www"
group = "production"
description = "Production server"

[ssh_servers.winhost]
host = "192.168.1.90"
user = "svc-ssh"
key_path = "~/.ssh/winhost_key"
port = 2222
platform = "windows"

[ssh_servers.internal]
host = "10.0.0.5"
user = "admin"
proxy_jump = "bastion"

OpenSSH 用户证书——对于信任证书颁发机构(TrustedUserCAKeys)的服务器,请将 CERTPATH / cert_path 指向为 KEYPATH 签发的证书(通常是 <key>-cert.pub)。每次连接时都会读取该文件,因此在磁盘上续期的短期证书无需重启;如果文件缺失,连接会失败,而不会回退到未签名的密钥。此功能将在 ssh2 支持证书后生效(mscdex/ssh2#1495);在此之前,仍会像以往一样提供普通密钥。ssh_sync 使用系统的 ssh,它会自行查找密钥旁边的 <key>-cert.pub。

加载顺序按优先级从高到低排列:进程环境变量 → .env → 加密保险库 → TOML。你主动存入保险库的凭据优先于留在 .env 中的凭据;操作员为单次运行设置的覆盖值则优先于两者。

配置档案会按项目类型打包别名和钩子。使用 export SSH_MANAGER_PROFILE=frappe 设置配置档案,或者从助手中切换;助手会将其记在 ~/.ssh-manager/profile 中。内置 default、frappe、docker 和 nodejs;你可以在 profiles/ 中添加自己的配置档案。自定义别名和钩子也保存在 ~/.ssh-manager/ 中,因此升级后仍会保留。

更多示例:examples/codex-ssh-config.example.toml。

连接无法直接访问的机器

通过堡垒机——隧道是透明的,所有工具都能照常使用:

SSH_SERVER_BASTION_HOST=bastion.example.com
SSH_SERVER_BASTION_USER=jumpuser
SSH_SERVER_BASTION_KEYPATH=~/.ssh/bastion_key

SSH_SERVER_PRIVATE_HOST=10.0.0.5
SSH_SERVER_PRIVATE_USER=admin
SSH_SERVER_PRIVATE_PROXYJUMP=bastion

支持串联:如果 bastion 本身配置了 PROXYJUMP,也会递归地跟随该配置。系统会检测并拒绝循环引用。

通过 SOCKS 代理或自定义命令——命令在本地运行并转发到主机,可使用 %h 和 %p 分别表示主机和端口:

SSH_SERVER_SOCKS_PROXYCOMMAND="ncat --proxy 127.0.0.1:1080 --proxy-type socks5 %h %p"
SSH_SERVER_WINPROXY_PROXYCOMMAND="C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p user@jump-host"

受密码短语保护的密钥——将密钥加载到 ssh-agent 即可,无需其他操作;系统会自动使用 SSH_AUTH_SOCK,与普通 ssh 使用的机制相同。也可以在配置中存储 PASSPHRASE,但这不是理想做法。

Agent 转发(FORWARD_AGENT=true,默认关闭,按服务器配置)可让远程主机上的进程使用你的本地密钥向其他主机进行身份验证——例如,在服务器上通过 SSH 执行 git clone,而无需将私钥复制到服务器。

⚠️ 任何能够读取该主机上转发套接字的人——包括 root——都能在连接期间冒充你,访问其他主机。仅用于你信任的服务器;这与 ssh_config(5) 中的建议一致。 告知服务器有 Agent 正在操作(可为每台服务器设置 ANNOUNCE_AGENT=true,或为所有服务器设置 SSH_MANAGER_ANNOUNCE_AGENT=true;默认关闭)。随后,每个命令通道都会携带 AI_AGENT=mcp-ssh-manager,遵循 通过 SSH 传递 AI_AGENT 的约定,这样记录该值的主机就能区分由 Agent 操作的会话和由人员操作的会话——SSH 本身无法做到这一点:无论哪种情况,密钥和用户都相同。感谢 @mthamil107 在 #84 中贡献此功能。

  • 服务器必须接受该值。 标准 OpenSSH 默认配置为 AcceptEnv LANG LC_*,并会静默丢弃其他所有值。将 AcceptEnv AI_AGENT 添加到 sshd_config 并重新加载;之后,Agent 运行的每条命令和每个 shell 都会设置 $AI_AGENT,供配置文件、封装脚本或审计钩子记录。
  • 默认关闭,原因有二。 升级不能改变发送到服务器的内容。而且,无论服务器是否设置了 AcceptEnv,请求都会发送到每台主机——sshd 只是不保存该值——因此,不受你控制的主机会得知另一端有 Agent,还可能针对 Agent 调整输出。全局开关启用时,可设置 ANNOUNCE_AGENT=false 让某台主机保持静默。
  • **适用范围:**命令、ssh_tail --follow、交互式会话,以及 ssh_sync(通过 SendEnv,OpenSSH 3.9 起支持)。**不适用范围:**SFTP 传输——如果服务器拒绝该变量,ssh2 会导致整个 SFTP 会话失败;以及端口转发,因为它没有环境变量。
  • 绝不会告知服务器有人员正在操作。 你从控制平面执行的所有操作——shell、文件操作、健康检查或跨组命令——都由你执行,并且不会带标签地发送到服务器。

分组——为服务器添加标签,它们就会自动组成一个组,无需维护额外文件:

SSH_SERVER_WEB1_GROUP=production
SSH_SERVER_WEB2_GROUP=production

通过 ssh_group_manage 创建的组保存在 .server-groups.json 中,并且还会包含执行设置(策略、延迟、出错时停止)。当同名组同时存在于两处时,成员关系取并集,并使用已保存的设置。组名不区分大小写。仅通过 group 字段存在的组对于 ssh_group_manage 是只读的——请编辑服务器以更改成员关系。

遇到问题时

Claude Code 卡住或显示“Interrupted”——几乎总是因为输出过大,超出上下文限制。输出会自动截断,默认超时时间为两分钟,但你可以调整:

MCP_SSH_MAX_OUTPUT_LENGTH=5000    # default 10000 characters
MCP_SSH_DEFAULT_TIMEOUT=180000    # default 120000 ms
MCP_SSH_COMPACT_JSON=true         # fewer tokens per response

与其使用 cat huge.log,不如优先使用 tail -n 100 huge.log——这也是你会给同事的建议。

工具没有显示——先运行 claude mcp list,然后重启 Claude Code。在 Claude Code 中使用 /mcp 可查看实时状态。

连接失败——先运行 ssh-manager server test <name>;它会告诉你问题出在 DNS、防火墙还是凭据。

权限被拒绝——检查 chmod 600 ~/.ssh/your_key,然后检查用户名,最后检查该用户在主机上获准执行的操作。

还是解决不了?提交问题——请附上服务器的 PLATFORM,以及 ssh-manager server test 的输出。

已知限制,如实说明:

  • 命令超时只是建议。 ssh2 无法终止远程进程;在 Linux 和 macOS 主机上,timeout 封装脚本可以正确处理。Windows 主机上请设置 PLATFORM=windows 以跳过该封装脚本,因为 Windows 版 OpenSSH 无法识别它。
  • 使用密码认证的 ssh_sync 需要 sshpass。 无论如何,密钥认证更好。在 Windows 主机上,请传入原生路径,例如 local:C:\project——盘符路径和 UNC 路径会转换为 MSYS2 格式;已经写成 /c/... 的路径则会原样传递,不会重复转换。
  • 连接会被池化并重复使用。 过期连接会在下次使用时重新连接;可通过 ssh_connection_status 和 reconnect 操作强制重新连接。
参与项目开发
git clone https://github.com/bvisible/mcp-ssh-manager.git
cd mcp-ssh-manager && npm ci
./scripts/setup-hooks.sh      # pre-commit checks, including secret detection

npm test                      # 43 suites
npm run typecheck             # JSDoc through tsc, no build step
npm run test:all              # both, plus ./scripts/validate.sh
npm run test:preview          # isolated candidate fixture, restart and cleanup

目录结构:

src/          index.js is the MCP server and its 37 tools; one module per domain
              (ssh-manager, config-loader, session-manager, backup-manager,
               health-monitor, database-manager, tunnel-manager, server-groups…)
cli/          the Bash CLI, plus the Node wrapper that makes it work on Windows
ui/           the control plane's React interface (v4)
desktop/      the Electron build (v4)
profiles/     frappe, docker, nodejs — and room for yours
scripts/      validation, and the rig that regenerates every screenshot and the video
docs/         guides, migration notes, security modes

欢迎提交 Pull Request——详情请见 CONTRIBUTING.md。桌面版的发布流程——签名、公证,以及为什么 Mac App Store 是一个不同的产品,而非更进一步的发布渠道——请见 docs/DISTRIBUTION.md。

本 README 中的图片没有一张是手工制作的。scripts/demo-env.mjs 会在回环地址上启动三个真实的 ssh2 服务,并预置一个保险库、一项待处理的审批和一个实时流;capture-screenshots.mjs 和 record-demo.mjs 会通过 DevTools 协议驱动 Chrome 与这些服务交互;frame-screenshots.py 会绘制浏览器和应用窗口,macbook-mockup.py 会绘制笔记本电脑。更改 UI 后,请重新运行这些脚本,不要直接编辑图片。

主视觉动画提供浅色和深色两个版本,并通过 <picture> 根据 prefers-color-scheme 切换。使用单个透明 GIF 会更简单,但 GIF 的 alpha 通道只有 1 位,而且透明度会影响帧间压缩:同一段动画使用透明背景时大小为 11.4 MB,而使用纯色背景时只有 357 KB。


更新内容

4.0.1 — 应用会告知你有可用更新。 Options → Updates、侧边栏标记和每个版本一次的通知,确保新版本不再被你从未打开的菜单埋没;更整洁的 Servers 工具栏;界面会在打包时构建,而不是提交到代码库(你安装的内容与构建产物逐字节相同);npm、registry 和 GitHub 上的简介也说明了 V4 的内容。引擎行为没有变化。

4.0.0 — 控制平面。 查看 Agent 在你的服务上运行什么及其输出,并在它运行前将其停止。适用于 macOS、Windows 和 Linux 的桌面应用,可通过引擎中的 ssh-manager app 安装;用于凭据的加密保险库;每台服务均需人工审批;以及一台与你的远程服务并列的本地 Shell。所有新增功能均为可选——从 3.8.x 升级的 npm 安装会继续保持 3.8.x 的行为,测试会从 registry 安装并验证这一点。此版本的 Windows 应用尚未进行代码签名。了解有哪些变化以及如何回退。

v3.8.7 — 安全更新;请升级。 修复了两项安全公告:部分服务名称或别名可绕过 readonly 和 restricted 模式(GHSA-mq9f-5385-rjf4),而 ssh_backup_restore 的 backupId 会在服务上运行命令(GHSA-2wjh-xm9c-7qf9)。请参见 CHANGELOG。

v3.8.6 — 安全更新;请升级。 修复了六项安全公告。默认的 on-error hook 会允许你连接的任何 SSH 服务在你的机器上运行命令;restricted 模式只检查行首;ssh_db_query 可能执行写入;从不校验主机密钥。请参见 CHANGELOG。

v3.8.5 — 安全更新。 修复了三项命令注入安全公告,其中一项可绕过 readonly 模式。如果你使用 ssh_backup_*、ssh_db_dump、ssh_service_status 或 ssh_tail,请升级。

  • 绕过 readonly / restricted 实现 RCE (GHSA-m793-whw6-f537) — ssh_service_status 和 ssh_tail 是只读工具,因此在你锁定的服务上仍会保持启用,而且它们既不会对参数加引号,也不会查询策略层。像 nginx; id > /tmp/pwned 这样的服务名称会被执行。
  • 通过 ssh_db_dump 实现 RCE (GHSA-796j-h5q5-jx6p) — 转储后执行的 stat 命令会原样插入输出路径。v3.6.7 补丁少修了一行。
  • 通过所有 ssh_backup_* 工具实现 RCE (GHSA-qwwm-vrm9-4mw8) — backup-manager.js 的 9 个命令构造器都没有进行 shell 转义,而 database-manager.js 有 95 处。

现在,引号处理集中在一个模块中,因此“这个构造器是否对输入加了引号?”这个问题只有一个答案。

完整变更日志,涵盖 v1.0.0 至今的所有版本 →


文档 · 变更日志 · 安全策略 · 路线图 · 问题反馈


基于 Model Context Protocol 构建,由 ssh2 处理核心工作。 采用 MIT 许可,详见 LICENSE。


为 Claude Code 社区倾心打造 ❤️



SSH Manager MCP 服务

MCP Toplist

发布前验证

V4 测试指南介绍了离线测试套件、真实环境下的 npm 3.8.5 → V4 → 回滚检查、浏览器流程和平台发布门槛。 发布前,请使用最终版 V4 测试指南,通过一次性配置文件检查实际的 npm 包或桌面候选版本。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。