使用说明
SSH Server MCP
一个面向可信内网测试环境的 SSH MCP(Model Context Protocol)服务器,用于动态管理测试服务器连接、执行命令、传输文件和开展交互式排障。
项目定位与使用边界
本项目定位为可信内网测试环境中的高权限排障工具,不面向公网或生产环境。它假设 MCP 客户端、运行本程序的本地主机以及目标测试服务器均处于受信任边界内。
为提高测试排障效率,本项目有意采用以下设计:
- 允许通过 MCP 动态注册测试服务器,无需修改配置或重启服务
- 允许执行任意远程命令,便于定位临时、复杂和交互式问题
- 允许在本地与测试服务器之间传输文件和目录
- 支持长生命周期的交互式 SSH 会话
这些能力是针对受控测试环境的便利性取舍,不提供生产级的命令白名单、远程主机准入、操作审批或强制主机密钥验证。请勿将本项目暴露到公网、接入生产服务器,或在多人不可信环境中共享使用。
功能特性
- 动态注册SSH服务器 - 快速接入临时测试服务器,支持密码和私钥两种认证方式
- 配置文件加载 - 通过
--config参数预加载服务器配置 - 执行远程命令 - 在已注册的服务器上执行任意命令
- 有界命令输出 - stdout 和 stderr 默认各保留最新 1 MiB,可通过
maxBytes调整 - 流式文件传输 - 基于本地路径上传和下载时使用流式复制,避免大文件整体载入内存
- 连接管理 - 自动重连、连接测试
- 安全隐藏 - 列出服务器时自动隐藏密码
安装构建
.\build.ps1
启动方式
1. MCP服务器模式(默认)
./ssh-server-mcp.exe --config=servers.csv
2. 交互式Shell模式
./ssh-server-mcp.exe --shell --config=servers.csv
交互式Shell提供类似XShell的体验:
╔════════════════════════════════════════════╗
║ SSH Server MCP - Interactive Shell ║
╚════════════════════════════════════════════╝
输入 'help' 查看可用命令, 'exit' 退出
ssh-mcp> list
┌──────┬─────────────────────┬──────┬──────────┬─────────┐
│ 名称 │ 地址 │ 端口 │ 用户 │ 状态 │
├──────┼─────────────────────┼──────┼──────────┼─────────┤
│ prod │ 43.167.188.85 │ 22 │ root │ 离线 │
└──────┴─────────────────────┴──────┴──────────┴─────────┘
ssh-mcp> connect prod
已连接到 prod (root@43.167.188.85:22)
prod> uname -a
Linux VM-0-7-opencloudos 6.6.117-45.1.oc9.x86_64 ...
prod> shell
# 进入真正的SSH终端模式
prod> exit
再见!
交互式命令:
| 命令 | 说明 |
|---|---|
list, ls |
列出所有服务器 |
connect <name> |
连接服务器 |
disconnect |
断开当前连接 |
exec <cmd> |
执行命令 |
shell |
进入终端模式 |
add <name> <host> <port> <user> <pass> |
添加服务器 |
remove <name> |
移除服务器 |
info [name] |
显示服务器信息 |
help |
显示帮助 |
exit |
退出 |
连接服务器后可直接输入命令执行。
配置文件格式
支持CSV和JSON两种格式,根据文件扩展名自动识别。
CSV格式(推荐,易于编辑)
# SSH服务器配置文件
# 格式: name,host,port,user,password,keyFile
# password和keyFile二选一,不需要的字段留空
# 密码含逗号时用双引号包裹
prod-server,192.168.1.100,22,root,your-password,
dev-server,dev.example.com,22,admin,"pass,word",
key-server,10.0.0.1,2222,ubuntu,,~/.ssh/id_rsa
| 列 | 说明 |
|---|---|
| name | 服务器名称(唯一标识) |
| host | 服务器地址 |
| port | SSH端口(默认22) |
| user | 用户名 |
| password | 密码(含逗号需用引号包裹) |
| keyFile | 私钥文件路径 |
私钥路径和文件传输的本地路径支持 ~、$VAR、${VAR} 和 %VAR% 环境变量,并会转换为规范化的绝对路径。
JSON格式
{
"servers": [
{
"name": "prod-server",
"host": "192.168.1.100",
"port": 22,
"user": "root",
"password": "your-password"
},
{
"name": "dev-server",
"host": "dev.example.com",
"user": "admin",
"keyFile": "~/.ssh/id_rsa"
}
]
}
提供的工具
1. register_ssh_server
注册一个新的SSH服务器连接。
参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| name | string | 是 | 服务器名称,用于后续引用 |
| host | string | 是 | 服务器地址 |
| port | number | 否 | SSH端口,默认22 |
| user | string | 是 | 用户名 |
| password | string | 否* | 密码(与keyFile二选一) |
| keyFile | string | 否* | 私钥文件路径(与password二选一) |
*密码和私钥必须提供其中之一
2. unregister_ssh_server
注销一个已注册的SSH服务器。
参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| name | string | 是 | 要注销的服务器名称 |
3. list_ssh_servers
列出所有已注册的SSH服务器。
4. ssh_execute
在指定的SSH服务器上执行命令。
参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| server | string | 是 | 服务器名称 |
| command | string | 是 | 要执行的命令 |
| timeout | number | 否 | 超时时间(秒),默认30秒 |
| maxBytes | number | 否 | stdout 和 stderr 各自保留的最大字节数,默认 1048576,最大 10485760;超限时保留最新输出 |
5. 异步命令任务
用于启动长时间运行的非交互命令,MCP 调用无需等待命令结束。stdout 和 stderr 分开增量读取,每个任务都有独立超时和有界缓冲。
| 工具 | 说明 |
|---|---|
ssh_command_start |
启动异步命令,返回 taskId 和初始输出 |
ssh_command_read |
读取尚未消费的 stdout/stderr |
ssh_command_status |
查询状态但不消费输出 |
ssh_command_cancel |
取消运行中的命令并返回已有输出 |
ssh_command_list |
列出运行中及最近完成的任务 |
默认任务超时为 300 秒,最大 3600 秒;stdout 和 stderr 默认各使用 1 MiB 缓冲。全局最多同时运行 16 个任务,每台服务器最多 4 个。完成的任务保留 10 分钟,便于读取最终输出。
6. test_ssh_connection
测试指定SSH服务器的连接状态。
参数:
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| name | string | 是 | 服务器名称 |
安装配置
构建
.\build.ps1
在Claude Desktop中配置
编辑Claude Desktop配置文件(Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"ssh-server": {
"command": "E:\\Code\\GitHub\\ssh-server-mcp\\ssh-server-mcp.exe",
"args": ["--config=E:\\Code\\GitHub\\ssh-server-mcp\\servers.csv"]
}
}
}
在Claude Code中配置
编辑 ~/.claude/settings.json 或使用 /update-config 命令:
{
"mcpServers": {
"ssh-server": {
"command": "E:\\Code\\GitHub\\ssh-server-mcp\\ssh-server-mcp.exe",
"args": ["--config=E:\\Code\\GitHub\\ssh-server-mcp\\servers.csv"]
}
}
}
使用示例
注册服务器(密码认证)
{
"name": "register_ssh_server",
"arguments": {
"name": "my-server",
"host": "192.168.1.100",
"port": 22,
"user": "admin",
"password": "your-password"
}
}
注册服务器(私钥认证)
{
"name": "register_ssh_server",
"arguments": {
"name": "prod-server",
"host": "production.example.com",
"user": "deploy",
"keyFile": "C:\\Users\\YourName\\.ssh\\id_rsa"
}
}
执行命令
{
"name": "ssh_execute",
"arguments": {
"server": "my-server",
"command": "ls -la /var/log",
"timeout": 60
}
}
列出服务器
{
"name": "list_ssh_servers",
"arguments": {}
}
测试连接
{
"name": "test_ssh_connection",
"arguments": {
"name": "my-server"
}
}
注销服务器
{
"name": "unregister_ssh_server",
"arguments": {
"name": "my-server"
}
}
安全注意事项
本项目的安全边界是可信内网测试环境。使用时请遵守以下约束:
- 仅限测试环境 - 不要连接生产服务器,不要将 MCP 服务暴露到公网
- 可信客户端 - 仅允许受信任的本地 MCP 客户端调用本服务
- 高权限能力 - 动态注册、任意命令执行和文件传输均为预期功能,调用方拥有与 SSH 账号等同的权限
- 密码存储 - 当前版本密码存储在进程内存中,服务器重启后需要重新注册;配置文件和凭证文件不得提交到版本库
- 主机密钥 - 当前接受所有主机密钥,以方便临时测试服务器接入;不要在不可信网络中使用
- 最小化凭证 - 建议使用专用测试账号和测试密钥,不要复用生产环境凭证
技术架构
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ MCP Client │────▶│ MCP Server │────▶│ SSH Servers │
│ (Claude/etc) │ │ (this project) │ │ (remote) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│
▼
┌──────────────────┐
│ Server Manager │
│ - Register │
│ - Unregister │
│ - Execute │
│ - List │
└──────────────────┘
许可证
MIT License
