使用说明
SSH MCP服务器
一个暴露一个工具的最小MCP服务器-- ssh_exec --因此,Claude Code、OpenAI Codex或任何兼容MCP的AI都可以通过SSH在远程主机上运行命令并检查输出。它支持两者 stdio 和 streamable-http 运输。
它做什么
- 默认情况下启动MCP stdio服务器。
- 也可以通过以下方式为MCP服务
streamable-http在/mcp. - 暴露
ssh_exec(command, host, user, password, port, identity_file, timeout_sec, strict_host_key_checking). - 用途 参数 对于SSH--不依赖于系统
ssh二元的。 - 支持 密码认证 和 公钥认证.
- 返回结构化输出:
ok,exit_code,stdout,stderr,target.
先决条件
- 码头工人
- 克劳德代码CLI(
claude)和/或OpenAI Codex CLI(codex)已安装并验证
塑造形象
cd /path/to/ssh-mcp
docker build -t ssh-mcp:latest .
以流式HTTP运行
集 MCP_TRANSPORT=streamable-http 启动HTTP MCP端点,而不是默认的stdio服务器。
本地Python
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
MCP_TRANSPORT=streamable-http \
MCP_HOST=127.0.0.1 \
MCP_PORT=8000 \
python server.py
MCP端点将在 http://127.0.0.1:8000/mcp.
码头工人
在Docker中运行时,绑定到 0.0.0.0 因此,该端口可以在集装箱外到达:
docker run --rm -p 8000:8000 \
-e MCP_TRANSPORT=streamable-http \
-e MCP_HOST=0.0.0.0 \
-e MCP_PORT=8000 \
-e SSH_DEFAULT_HOST=your-host.example.com \
-e SSH_DEFAULT_USER=ubuntu \
-e SSH_ALLOWED_HOSTS=your-host.example.com \
ssh-mcp:latest
MCP端点将在 http://localhost:8000/mcp.
如果您的客户端支持无状态HTTP MCP会话,请添加 -e MCP_STATELESS_HTTP=true 到 docker run 命令。
添加到克劳德代码
选项1:Claude Code CLI(推荐)
这些示例使用默认值 stdio 运输。
基于密钥的身份验证:
claude mcp add sshRemote -- \
docker run --rm -i \
-v "$HOME/.ssh:/home/app/.ssh:ro" \
-e HOME=/home/app \
-e SSH_DEFAULT_HOST=your-host.example.com \
-e SSH_DEFAULT_USER=ubuntu \
-e SSH_ALLOWED_HOSTS=your-host.example.com \
ssh-mcp:latest
密码验证:
claude mcp add sshRemote -- \
docker run --rm -i \
-e SSH_DEFAULT_HOST=your-host.example.com \
-e SSH_DEFAULT_USER=ubuntu \
-e SSH_DEFAULT_PASSWORD=your-password \
-e SSH_ALLOWED_HOSTS=your-host.example.com \
ssh-mcp:latest
验证是否已添加:
claude mcp list
选项2: ~/.claude.json (手动配置)
将以下内容添加到您的 ~/.claude.json 在...之下 mcpServers 按键:
{
"mcpServers": {
"sshRemote": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/Users/<your-user>/.ssh:/home/app/.ssh:ro",
"-e", "HOME=/home/app",
"-e", "SSH_DEFAULT_HOST=your-host.example.com",
"-e", "SSH_DEFAULT_USER=ubuntu",
"-e", "SSH_ALLOWED_HOSTS=your-host.example.com",
"ssh-mcp:latest"
]
}
}
}
选项3:项目级配置(.claude/settings.json)
要将服务器范围限定到单个项目,请将其添加到 .claude/settings.json 在项目根目录中:
{
"mcpServers": {
"sshRemote": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/Users/<your-user>/.ssh:/home/app/.ssh:ro",
"-e", "HOME=/home/app",
"-e", "SSH_DEFAULT_HOST=your-host.example.com",
"-e", "SSH_DEFAULT_USER=ubuntu",
"-e", "SSH_ALLOWED_HOSTS=your-host.example.com",
"ssh-mcp:latest"
]
}
}
}
添加到OpenAI Codex
选项1:Codex CLI(推荐)
这些示例使用默认值 stdio 运输。
codex mcp add sshRemote -- \
docker run --rm -i \
-v $HOME/.ssh:/home/app/.ssh:ro \
-e HOME=/home/app \
-e SSH_DEFAULT_HOST=your-host.example.com \
-e SSH_DEFAULT_USER=ubuntu \
-e SSH_ALLOWED_HOSTS=your-host.example.com \
ssh-mcp:latest
codex mcp list
选项2: ~/.codex/config.toml
[mcp_servers.sshRemote]
command = "docker"
args = [
"run", "--rm", "-i",
"-v", "/Users/<your-user>/.ssh:/home/app/.ssh:ro",
"-e", "HOME=/home/app",
"-e", "SSH_DEFAULT_HOST=your-host.example.com",
"-e", "SSH_DEFAULT_USER=ubuntu",
"-e", "SSH_ALLOWED_HOSTS=your-host.example.com",
"ssh-mcp:latest"
]
startup_timeout_sec = 20
tool_timeout_sec = 120
然后重新启动Codex(CLI/TUI/IDE扩展)并验证:
codex mcp list
指定主机、用户和端口
您有两种方法可以提供连接详细信息:
通过环境变量(每次调用的默认值)
通过 -e 旗帜到 docker run:
| 变量 | 示例 | 描述 |
|---|---|---|
SSH_DEFAULT_HOST |
my-server.example.com |
远程主机名或IP |
SSH_DEFAULT_USER |
ubuntu |
SSH登录用户名 |
SSH_DEFAULT_PORT |
2222 |
SSH端口(默认: 22) |
SSH_ALLOWED_HOSTS |
my-server.example.com |
以逗号分隔的主机列表 |
通过工具参数(每次调用覆盖)
您还可以在提示AI时直接传递连接详细信息:
Run ssh_exec with host="10.0.1.50", user="admin", port=2222, command="uptime"
每次调用的参数会覆盖环境变量的默认值。
认证
这 ssh_exec 工具根据您提供的内容选择身份验证方法:
| 您提供的内容 | 使用的验证方法 |
|---|---|
password |
仅密码身份验证(禁用密钥查找) |
identity_file |
指定的私钥文件 |
| 两者都不是 | 密钥来自 ~/.ssh SSH代理自动尝试 |
密码认证
将密码作为环境变量默认值或每次调用参数传递:
默认情况下(env-var):
-e SSH_DEFAULT_PASSWORD=hunter2
作为每次通话的参数:
Run ssh_exec with host="10.0.1.50", user="admin", password="hunter2", command="uptime"
提供密码后,密钥查找和SSH代理将被禁用,因此身份验证方法是明确的。
公钥认证
安装您的 ~/.ssh 将目录放入容器中,服务器将自动尝试在那里找到的密钥(如果转发套接字,则包括SSH代理):
-v "$HOME/.ssh:/home/app/.ssh:ro"
-e HOME=/home/app
使用特定密钥文件而不是扫描 ~/.ssh,将其作为每次调用参数传递:
Run ssh_exec with host="10.0.1.50", user="admin", identity_file="/home/app/.ssh/id_deploy", command="uptime"
设置(如果您还没有密钥对):
-
生成密钥:
ssh-keygen -t ed25519 -C "ssh-mcp" -
将其复制到远程主机:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-host.example.com -
测试无密码登录:
ssh user@your-host.example.com "echo ok"
环境变量引用
| 变量 | 默认值 | 描述 |
|---|---|---|
SSH_DEFAULT_HOST |
(无) | 默认远程主机 |
SSH_DEFAULT_USER |
(无) | 默认SSH用户名 |
SSH_DEFAULT_PASSWORD |
(无) | 默认SSH密码(密码认证) |
SSH_DEFAULT_PORT |
22 |
默认SSH端口 |
SSH_DEFAULT_TIMEOUT_SEC |
60 |
默认命令超时(秒) |
SSH_CONNECT_TIMEOUT_SEC |
10 |
SSH连接超时(秒) |
SSH_ALLOWED_HOSTS |
(无,允许所有) | 逗号分隔的主机列表 |
SSH_MAX_OUTPUT_CHARS |
12000 |
输出截断限制 |
MCP_TRANSPORT |
stdio |
MCP传输: stdio 或 streamable-http |
MCP_HOST |
127.0.0.1 |
为HTTP传输绑定主机 |
MCP_PORT |
8000 |
绑定HTTP传输端口 |
MCP_STREAMABLE_HTTP_PATH |
/mcp |
MCP端点的HTTP路径 |
MCP_STATELESS_HTTP |
false |
启用无状态流式HTTP会话 |
MCP_MOUNT_PATH |
/ |
高级:FastMCP使用的ASGI安装路径 |
示例提示
- “使用
sshRemotessh_exec然后跑uname -a." - “跑
df -h在远程主机上,总结磁盘使用情况。" - “跑
journalctl -u nginx -n 200 --no-pager并查找最近的错误。" - “检查CPU负载
my-server.example.com和uptime."
安全说明
- 此服务器可以执行任意远程shell命令——将其视为高权限工具。
- 始终设置
SSH_ALLOWED_HOSTS以限制可以针对哪些主机。 - 尽可能在远程主机上使用权限最低的SSH用户。
- 保持
strict_host_key_checking=true(默认)以防止MITM攻击。 - 在可能的情况下,更喜欢基于密钥的身份验证而不是密码。如果您确实使用了密码,请通过环境变量传递它,而不是作为工具参数传递,这样它就不会出现在对话日志中。