mcpField
M
Mcp Remote Ssh

Mcp Remote Ssh

本地服务
github.com/faizbawa开发工具1210 周前更新

关于 Mcp Remote Ssh

Mcp Remote Ssh 是供 AI Agent 远程使用 SSH 的 MCP 服务,集成持久会话、命令执行、SFTP、端口转发、会话记录和输出脱敏。

主要功能

  1. 01持久 SSH 会话
  2. 02结构化命令输出与退出码
  3. 03SFTP 文件传输
  4. 04SSH 端口转发
  5. 05注入密钥并脱敏输出
  6. 06可选会话记录

适用场景

  1. 01在远程主机执行命令
  2. 02通过 SFTP 传输文件
  3. 03使用远程凭据且不在响应中暴露其值
  4. 04记录 SSH 活动以便调试

MCP 相关

向 MCP 客户端提供 SSH 连接、命令、Shell、密钥管理、会话记录、SFTP 和端口转发工具。从本地环境文件载入的密钥值会从工具响应中脱敏。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"remote-ssh": {
"command": "uvx",
"args": [
"mcp-remote-ssh"
]
}
}
}
启动命令uvx mcp-remote-ssh

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

安装包
pypimcp-remote-ssh

工具

20

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

参数类型必填说明
hoststring是远程服务的主机名或 IP 地址。
key_pathstring否SSH 私钥文件的路径。使用密码身份验证时留空。
passwordstring否用于身份验证的密码。使用密钥身份验证时留空。
portinteger否SSH 端口(默认值:22)。
timeoutinteger否连接超时时间(秒)(默认值:60)。
usernamestring否SSH 用户名(默认值:root)。

详细介绍

mcp-remote-ssh

PyPI Python License: MIT

为 AI Agent 提供完整 SSH 访问能力的 MCP 服务——支持持久会话、结构化命令输出、SFTP 文件传输、端口转发、会话记录,以及安全注入环境变量并自动脱敏输出。

为什么需要它

其他 SSH MCP 服务各有缺失:不支持密码身份验证、持久会话、SFTP、端口转发或结构化退出代码。而这个服务全部支持——还提供了唯一一种 MCP 级别的机密管理机制,可防止 AI Agent 看到你的凭据。

安全注入环境变量

**问题:**当 AI Agent 需要在远程服务器上使用 API 令牌、密码或密钥时,常规做法会将机密暴露在大模型的上下文窗口中。Agent 要么读取机密文件(机密就此进入对话),要么运行 echo $TOKEN 并在输出中看到机密值。

解决方案:ssh_load_env_file 会从你本机上的文件读取机密,将其注入远程 SSH 会话,并将其登记为自动脱敏内容。AI Agent 可以自由使用这些变量——每条工具响应都会先经过清理,再发送给大模型。

# Agent calls this -- file is read from YOUR machine, not the remote host
ssh_load_env_file(session_id="abc", file_path="~/.secrets/prod.env")
→ "Loaded 3 variables from local:~/.secrets/prod.env: API_TOKEN, DB_PASS, SECRET_KEY"

# Agent tries to echo the value -- redacted automatically
ssh_execute(session_id="abc", command="echo $API_TOKEN")
→ {"stdout": "***\n", "exit_code": 0}

# Agent dumps the environment -- all secret values scrubbed
ssh_execute(session_id="abc", command="env | grep API_TOKEN")
→ {"stdout": "API_TOKEN=***\n", "exit_code": 0}

# Agent reads a file containing a secret -- also redacted
ssh_read_remote_file(session_id="abc", remote_path="/etc/app/config")
→ "db_password=***\ndb_host=localhost\n"

# Normal commands work perfectly -- no over-redaction
ssh_execute(session_id="abc", command="uname -a")
→ {"stdout": "Linux server 6.1.0 ...", "exit_code": 0}
工作原理
┌─────────┐         ┌──────────────────────────────┐         ┌─────────────┐
│   LLM   │ ←─JSON─ │   MCP Server (your machine)  │ ──SSH─→ │ Remote Host │
│ (Agent) │         │                              │         │             │
└─────────┘         │  1. Reads ~/.secrets/prod.env│         └─────────────┘
                    │  2. Parses KEY=VALUE pairs   │
                    │  3. Stores values in memory  │
                    │  4. Injects into SSH session │
                    │  5. Redacts ALL tool output  │
                    └──────────────────────────────┘
  1. 读取本地文件——环境变量文件位于你的本机上,不会出现在远程主机
  2. 通过 Shell 内置命令注入——使用 read -r VAR <<< 'value' && export VAR(不会暴露进程树)
  3. 基于标准输入注入执行命令——ssh_execute 通过标准输入将机密传递给 bash 包装器,因此它们不会出现在 /proc/*/cmdline 中
  4. 自动脱敏——每条工具响应(ssh_execute、ssh_shell_send、ssh_shell_read、ssh_read_remote_file)都会先经过清理,再发送给大模型
  5. 优先匹配最长字符串——避免部分匹配造成内容损坏(例如,先替换 abc123,再替换 abc)
安全属性
威胁是否缓解?方式
机密出现在大模型上下文窗口中是将输出中的机密值替换为 ***
机密出现在远程进程树中(Shell)是Shell 内置命令(read/export)不会派生进程
机密出现在远程进程树中(执行命令)是机密通过标准输入传递,不会出现在 /proc/*/cmdline 中
大模型尝试对环境变量文件运行 cat不适用文件仅位于本地,远程不存在
大模型尝试运行 echo $VAR是输出会经过脱敏
对机密进行编码或转换(Base64)否只对字面匹配项进行脱敏
首次 SSH 连接遭受中间人攻击可接受使用了 AutoAddPolicy——参见下方说明
主机密钥策略

此服务使用 Paramiko 的 AutoAddPolicy——未知主机密钥会直接接受,不会提示确认。这是有意为之,适用于主机生命周期短暂的 QE/实验室环境(Beaker、云实例、CI 机器)。取舍如下:

  • **优点:**连接新配置的机器无需任何操作
  • **缺点:**首次连接未知主机时容易遭受中间人攻击

如果你在不可信网络上操作,可考虑通过 VPN 或预先分发主机密钥的 SSH 堡垒机转发连接。未来版本可能会为安全要求严格的环境添加 host_key_policy 参数。

环境变量文件格式

标准 .env 格式:

# Comments are ignored
API_TOKEN=your-secret-token
DB_PASSWORD="quoted values work"
SECRET_KEY='single quotes too'
export ALSO_WORKS=yes

会话记录

默认情况下不启用记录。需要审计 Agent 实际运行的内容时,可按会话启用——有助于复现 Bug 和开展测试活动。

# Start recording on connect
ssh_connect(host="lab.example.com", username="root", password="...", record=True)

# Or toggle later
ssh_start_recording(session_id="a1b2c3d4")
ssh_execute(session_id="a1b2c3d4", command="uname -a")
ssh_get_transcript(session_id="a1b2c3d4")
→ {"recording": true, "total_entries": 2, "transcript": "[12:01:02] --- connect: lab.example.com ---\n[12:01:05] $ uname -a\nLinux ...\n[exit 0]"}

ssh_save_transcript(session_id="a1b2c3d4", path="/tmp/lab-session.log")
ssh_stop_recording(session_id="a1b2c3d4")
  • 执行命令/sudo 的输出以及 Shell 发送/读取的 I/O,在记录前都会进行机密脱敏
  • 关闭会话会丢弃内存中的记录——请先调用 ssh_save_transcript 或 ssh_get_transcript

安装

uvx mcp-remote-ssh        # or: pip install mcp-remote-ssh

配置

{
  "mcpServers": {
    "remote-ssh": {
      "command": "uvx",
      "args": ["mcp-remote-ssh"]
    }
  }
}

工具(24)

连接
工具描述
ssh_connect使用密码、密钥或 Agent 身份验证进行连接。可选设置 record=True,立即开始记录会话。返回 session_id
ssh_list_sessions列出活动会话
ssh_close_session关闭会话并释放资源
执行
工具描述
ssh_execute运行命令,返回 {stdout, stderr, exit_code}
ssh_sudo_execute以 sudo 提权运行命令
交互式 Shell
工具描述
ssh_shell_open打开持久 Shell(保留当前工作目录、环境变量和进程)
ssh_shell_send发送文本(可选按下 Enter)
ssh_shell_read读取当前输出缓冲区
ssh_shell_send_control发送 Ctrl+C、Ctrl+D 等控制信号
ssh_shell_wait等待匹配某个模式或输出稳定
密钥管理
工具描述
ssh_load_env_file从本地环境变量文件加载密钥;值不会返回给大模型
ssh_clear_secrets清除脱敏注册表(值将再次可见)
会话记录
工具描述
ssh_start_recording开始记录此会话的 execute/sudo/shell I/O
ssh_stop_recording停止记录;会话关闭前,会话记录仍可访问
ssh_get_transcript以文本或 JSONL 格式返回会话记录(last_n 可选)
ssh_save_transcript将会话记录写入 MCP 主机上的本地文件
SFTP
工具描述
ssh_upload_file将本地文件上传到远程主机
ssh_download_file将远程文件下载到本地机器
ssh_read_remote_file读取远程文本文件
ssh_write_remote_file写入远程文件或向其追加内容
ssh_list_remote_dir列出目录及元数据
端口转发
工具描述
ssh_forward_port创建 SSH 隧道(本地 -> 远程)
ssh_list_forwards列出活动隧道
ssh_close_forward关闭隧道

快速开始

ssh_connect(host="server.example.com", username="admin", password="secret", record=True)
→ {"session_id": "a1b2c3d4", "connected": true, "recording": true}

ssh_load_env_file(session_id="a1b2c3d4", file_path="~/.secrets/prod.env")
→ "Loaded 2 variables: API_TOKEN, DB_PASS"

ssh_execute(session_id="a1b2c3d4", command="curl -H \"Authorization: Bearer $API_TOKEN\" https://api.example.com")
→ {"stdout": "{\"status\": \"ok\"}", "exit_code": 0}  # token used but never visible

ssh_shell_open(session_id="a1b2c3d4")
ssh_shell_send(session_id="a1b2c3d4", data="cd /opt && make -j$(nproc)")
ssh_shell_wait(session_id="a1b2c3d4", pattern="$ ", timeout=600)

ssh_upload_file(session_id="a1b2c3d4", local_path="config.yaml", remote_path="/etc/app/config.yaml")
ssh_forward_port(session_id="a1b2c3d4", remote_port=5432, local_port=15432)

设计

基于 Paramiko(SSH)和 FastMCP(MCP 协议)构建。

  • ssh_execute 使用 exec_command(),提供清晰的结构化输出和真实退出码
  • 加载密钥后,ssh_execute 会通过 stdin 将导出语句传递给 bash 包装器,然后使用 exec 执行实际命令——密钥不会出现在进程树中
  • ssh_shell_* 使用 invoke_shell() 创建持久交互式会话
  • 所有阻塞的 Paramiko 调用都在 run_in_executor 中运行,以保持异步
  • Shell 会维护 500KB 的滚动缓冲区,供 shell_read 轮询
  • 密钥脱敏会在所有输出路径中按字符串长度从长到短进行替换
  • 会话记录保存在内存中,默认关闭,并会在会话关闭时丢弃

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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