关于 mcp-ssh-manager
mcp-ssh-manager 是面向希望监看并审批 Agent 操作的团队的 SSH MCP 服务。工具涵盖命令、文件、备份、健康检查和数据库操作,并提供可选控制界面与审计记录。
主要功能
- 01通过 SSH 执行命令和传输文件
- 02创建数据库备份并检查服务器健康状况
- 03按服务器设置请求审批
- 04查看命令输出与审计记录
- 05通过桌面或浏览器界面管理连接
适用场景
- 01检查生产服务器的资源使用情况
- 02部署前备份数据库
- 03在监督下部署文件并重启服务
- 04批量检查一组服务器
MCP 相关
该 MCP 服务向 MCP 客户端提供基于 SSH 的工具,涵盖命令、文件操作、数据库查询、备份、健康检查和隧道。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y mcp-ssh-managerSSH_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+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
37收录的工具列表 · 更新于 2 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| cwd | string | 否 | 工作目录(可选;如已配置则使用默认值) |
| server | string | 是 | 配置中的服务器名称 |
| command | string | 是 | 要执行的命令 |
| timeout | number | 否 | 命令超时时间,单位为毫秒(默认值:120000,最大值:300000) |
详细介绍
给你的 Agent 一个 shell,
看看它们会用它做什么。
一个用于 SSH 的 MCP 服务。让 Claude Code、Claude Desktop 和 OpenAI Codex(或任何 MCP 客户端)
在你的真实服务器上工作——运行命令、传输文件、查询数据库、创建备份、检查运行状况——
你可以在一旁看着它们操作。
未经剪辑的 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.exe | 4.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 即可打开此界面。
旁观操作过程——控制平面
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 首次需要发送通知时会请求你的许可。
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 的文件。
按需查看运行状况
后台不会执行任何探测。 每次检查都需要进行 SSH 握手,而定时连接所有生产环境机器的仪表盘还不如没有仪表盘。检查策略完全由你通过按钮控制。阈值由你设定;超过阈值时,界面会用文字说明,而不是仅靠颜色表示。
任意机器上的 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_create | MySQL、PostgreSQL、MongoDB 或文件 — 压缩备份,并包含元数据和保留策略 |
ssh_backup_list | 列出所有可用备份,以及大小、日期和保留策略 |
ssh_backup_restore | 还原单个备份,也支持跨数据库还原 |
ssh_backup_schedule | 加入 cron 定时任务,并自动清理 |
请参阅备份指南和 examples/backup-workflow.md。
健康状况与监控(v2.2+)
| 工具 | 功能 |
|---|---|
ssh_health_check | CPU、内存、磁盘、网络、运行时间、负载 — 并给出总体评估 |
ssh_service_status | 查看 systemd 或 sysv 上的 nginx、mysql、docker 等服务 |
ssh_process_manager | 列出、检查或终止进程;按 CPU 或内存排序 |
ssh_alert_setup | 设置阈值,以及超出阈值时的处理方式 |
ssh_monitor, ssh_tail | 实时资源监控和日志跟踪 |
数据库(v2.3+)
| 工具 | 功能 |
|---|---|
ssh_db_dump | MySQL、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。跳过通配符,多个别名合并为一台服务器 |
| FileZilla | sitemanager.xml。仅支持 SFTP 站点 — FTP 书签不是 SSH 服务器 |
| PuTTY | 导出的 .reg 文件。若使用 .ppk 密钥则会拒绝导入,并提示用于转换密钥的 puttygen 命令 |
| Termius | JSON 导出文件,包含分组 |
| MobaXterm | .mxtsessions,文件夹名会作为分组 |
| Transmit | 直接读取其收藏夹(macOS) |
绝不会读取密码。 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/ 中,因此升级后仍会保留。
连接无法直接访问的机器
通过堡垒机——隧道是透明的,所有工具都能照常使用:
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 处。
现在,引号处理集中在一个模块中,因此“这个构造器是否对输入加了引号?”这个问题只有一个答案。
发布前验证
V4 测试指南介绍了离线测试套件、真实环境下的 npm 3.8.5 → V4 → 回滚检查、浏览器流程和平台发布门槛。 发布前,请使用最终版 V4 测试指南,通过一次性配置文件检查实际的 npm 包或桌面候选版本。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。