SSH远程服务器管理工具

通过SSH连接多个远程服务器,执行命令、传输文件并跟踪长时间运行的进程的服务器管理工具。

  • by Edavi11
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 Edavi11/remote-context-mcp-server

使用说明

远程上下文mcp服务器

MCP服务器用于SSH远程服务器管理。通过SSH连接到多个远程服务器、执行命令、传输文件和跟踪长时间运行的进程——所有这些都来自您的LLM。

特性

  • 多个SSH连接 --根据需要配置任意数量的服务器,通过连接池重复使用
  • 两种身份验证方法 --用户名/密码或SSH私钥(按文件路径),带有可选的基于文件的密钥(passwordFile/passphraseFile)
  • 主机密钥验证(TOFU) -每个服务器的指纹被固定在第一个连接上,并在每次重新连接时进行验证,以捕获中间人的尝试
  • 指挥安全 --危险命令在执行前会被自动阻止(阻止列表),敏感服务器可以选择每个连接的允许列表
  • 长时间运行过程跟踪 --异步运行命令,轮询状态,并在运行中取消命令
  • 每个流程历史记录 --每个命令执行都记录有stdout、stderr、退出代码和计时(有界,以避免无限内存增长)
  • 持久审计日志 --每次执行都可以选择性地附加到本地JSONL文件中,以实现跨重启的可追溯性
  • SFTP文件传输 --通过相同的SSH连接上传/下载文件

安装

npx remote-context-mcp-server

或全局安装:

npm install -g remote-context-mcp-server

配置

设置 SSH_CONNECTIONS 带有JSON连接对象数组的环境变量:

[
  {
    "name": "production",
    "host": "192.168.1.100",
    "port": 22,
    "username": "ubuntu",
    "passwordFile": "/home/user/.secrets/prod-password"
  },
  {
    "name": "staging",
    "host": "staging.example.com",
    "port": 22,
    "username": "deploy",
    "privateKeyPath": "/home/user/.ssh/id_rsa"
  },
  {
    "name": "dev-box",
    "host": "10.0.0.5",
    "port": 2222,
    "username": "admin",
    "privateKeyPath": "/home/user/.ssh/dev_key",
    "passphrase": "keypassphrase",
    "allowedCommands": ["git ", "npm ", "ls", "cat ", "df", "systemctl status"]
  }
]

连接字段

字段 必填 描述
name 是 工具中用于引用此连接的唯一标识符
host 是 IP地址或主机名
port 无 SSH端口(默认值: 22)
username 是 SSH用户名
password 否* 身份验证密码(内联)
passwordFile 否* 包含密码的文件的路径-- 首选 结束 password 所以秘密不会直接存在 SSH_CONNECTIONS/env
privateKeyPath 否* 私钥文件的绝对路径(例如。 ~/.ssh/id_rsa)
passphrase 否 私钥的密码短语(内联)
passphraseFile 否 包含密钥密码的文件路径——首选 passphrase
allowedCommands No 正则表达式模式数组(锚定在命令的开头)。设置后,此连接上只允许使用匹配的命令——将默认块列表反转为敏感/生产服务器的显式分配列表

*要么 password, passwordFile,或 privateKeyPath 必须提供。

使用时 passwordFile/passphraseFile,使引用的文件只能由运行MCP服务器的用户读取(chmod 600).

环境变量

变量 默认值 描述
SSH_CONNECTIONS -- 连接配置的JSON数组(必填)
KNOWN_HOSTS_PATH ~/.remote-context-mcp/known_hosts.json 存储可信主机密钥指纹(TOFU)的位置
SSH_POOL_IDLE_MS 300000 (5分钟) 空闲池SSH连接在关闭前保持打开状态的时间
MAX_OUTPUT_BYTES 1000000 (1 MB) 截断前每个进程跟踪的最大stdout/stderr大小
MAX_PROCESS_RECORDS 500 内存中保存的最大进程记录数;在此之后,最旧的非运行记录将被删除
AUDIT_LOG_PATH ~/.remote-context-mcp/audit.jsonl 写入持久审计日志的位置
AUDIT_LOG_DISABLED false 设置为 "true" 禁用持久审核日志

克劳德桌面/光标设置

添加到MCP配置文件中:

{
  "mcpServers": {
    "remote-context": {
      "command": "npx",
      "args": ["-y", "remote-context-mcp-server"],
      "env": {
        "SSH_CONNECTIONS": "[{\"name\":\"my-server\",\"host\":\"192.168.1.100\",\"username\":\"ubuntu\",\"passwordFile\":\"/home/user/.secrets/my-server-password\"}]"
      }
    }
  }
}

可用工具

ssh_list_connections

列出所有已配置的连接。随时都可以安全地拨打电话——永远不会暴露凭据。

ssh_ping

测试与指定服务器的SSH连接,并返回延迟+服务器信息。

connection_name: "production"

ssh_exec

在远程服务器上执行命令。运行前是否提示用户确认取决于MCP客户端的设置——服务器本身不会强制确认,但无论客户端设置如何,它总是强制执行命令filter/allowlist。

connection_name:   "production"
command:           "df -h"
working_directory: "/var/www"   (optional)
timeout_seconds:   30           (optional, default 30)
async:             false        (optional, default false)
dry_run:           false        (optional, default false)

集 async: true 对于长时间运行的命令,该工具返回 process_id 命令立即在后台运行。集 dry_run: true 无需连接或执行任何操作,即可查看已解析的命令和筛选结果。

ssh_get_process

检索被跟踪进程的完整状态和输出(stdout+stderr)。

process_id: "proc_abc123_xyz"

ssh_list_processes

列出当前会话中的所有进程记录(仅元数据,无输出)。

connection_name: "production"   (optional filter)
status:          "running"      (optional filter: running|completed|failed|timeout|blocked|killed)

ssh_kill_process

取消以开头的正在运行的命令 ssh_exec (通常为 async: true 一)。

process_id: "proc_abc123_xyz"

ssh_upload_file

通过SFTP将本地文件上传到远程服务器。

connection_name: "production"
local_path:       "./build/app.tar.gz"
remote_path:      "/opt/releases/app.tar.gz"

ssh_download_file

通过SFTP从远程服务器下载文件。

connection_name: "production"
remote_path:      "/var/log/app.log"
local_path:       "./app.log"

指挥安全

以下类型的命令会被自动阻止:

  • 从根目录或关键目录中递归删除文件系统(rm -rf /, rm -rf /*, rm -rf /home, rm -rf /etc, …)
  • 破坏性等效物(find / -deletePython的 shutil.rmtree('/'))
  • 磁盘格式化(mkfs, wipefs)
  • 直接设备写入(dd if=... of=/dev/...)
  • 叉式炸弹
  • 远程脚本执行(curl | bash, wget | sh)
  • 代码执行混乱(base64 -d | bash)
  • 根密码更改
  • SSH密钥注入 authorized_keys
  • 服务器关闭/重新启动命令

此阻止列表是 纵深防御,不是保证 --它基于正则表达式,无法捕获所有等效命令。对于敏感或生产连接,设置 allowedCommands 在connection配置中,将该连接切换为显式的allowlist。

命令过滤器始终验证完全解析的命令(包括任何 cd 前缀来自 working_directory),因此走私空壳商无法绕过 working_directory.

已阻止的命令会记录其状态 blocked 以及解释他们被拒绝的原因。

进程状态

状态 含义
running 命令当前正在执行
completed 命令已完成,退出代码为0
failed 命令已完成,退出代码为非零
timeout 命令超过了配置的超时时间
blocked 命令被安全筛选器/allowlist拒绝
killed 命令已通过取消 ssh_kill_process

许可证

麻省理工学院