SSH远程命令执行工具

一个灵活的MCP服务器,用于通过SSH在远程服务器上执行命令,支持可配置的命令包装器,适用于需要安全远程操作的环境。

  • by BlockSecCA
  • HTML
  • 本地部署
  • 更新于
在 GitHub 查看 BlockSecCA/generic-ssh-mcp

使用说明

通用SSH MCP

一个灵活的MCP服务器,用于通过SSH在远程服务器上执行命令,并带有可选的命令包装器。

特性

  • 持久SSH连接:使用ssh2库快速执行命令
  • 可配置包装器:沙盒、超时或其他控制的可选命令包装器
  • 可配置工具名称:每个实例的自定义工具名称,便于在Claude UI中识别
  • 多个系统:为不同的目标系统构建单独的包
  • 简单的工具界面:带字符串参数的单个工具

快速开始

1.为您的目标系统构建

./build.sh ssh-ubuntupc

这创造了 ssh-ubuntupc.mcpb 您可以在Claude Desktop中安装。该工具将在Claude UI中显示为“ssh-ubuntupc”。

2.在Claude Desktop中安装

  1. 转移 .mcpb 文件到Windows
  2. 双击安装
  3. 配置:
    • SSH主机: 192.168.1.70 (使用IP地址,而不是主机名)
    • SSH用户名: YourUsername
    • SSH私钥路径: C:\Users\YourUsername\.ssh\id_ed25519
    • 命令超时: 30 (秒)
    • 命令包装器:留空以直接执行,或 srt 用于沙盒
    • 工具名称: ssh-ubuntupc (自动填充,有助于区分多个SSH服务器)

3.在Claude中使用

Using ssh-ubuntupc, run: ls -la /home/YourUsername

工具名称配置

当运行多个SSH MCP服务器(例如,每个远程系统一个)时,工具名称有助于在Claude UI中区分它们。

构建脚本会自动设置工具名称以匹配包名称:

./build.sh ssh-kali      # Tool appears as "ssh-kali" in Claude UI
./build.sh ssh-ubuntupc  # Tool appears as "ssh-ubuntupc" in Claude UI

没有这个,所有实例都将显示为“命令”,使其无法区分。

命令包装器

包装器字段允许您控制命令的执行方式:

无包装(空字符串):

  • 命令直接通过bash执行
  • 快速、无限制
  • 用于受信任的环境

随着 srt 包装:

  • 带有内核级限制的沙盒命令
  • 需要在远程系统上安装SRT
  • 文件系统和网络策略执行
  • 有关SRT设置,请参阅INSTALLATION.md

随着 timeout N 包装:

  • 命令限制为N秒
  • 超时自动终止
  • 适用于可能长时间运行的命令

随着 nice -n N 包装:

  • 命令以较低优先级运行
  • 对系统负载的影响较小

定制包装:

  • 任何接受命令字符串的命令
  • 例子: strace -e trace=file 用于调试

[!警告] 命令包装器配置:对于直接bash执行,请将包装器字段留空或使用单个空格 " ".切勿使用 "bash" 作为包装器,这会创建一个双bash调用(包装器bash+SSH守护进程bash),导致命令失败。

多个系统

为每个要连接的系统构建一个包:

./build.sh ssh-ubuntupc    # Creates ssh-ubuntupc.mcpb
./build.sh ssh-kali        # Creates ssh-kali.mcpb
./build.sh ssh-pihole      # Creates ssh-pihole.mcpb  
./build.sh ssh-prodserver  # Creates ssh-prodserver.mcpb

每个软件包都是独立的,在Claude Desktop中有自己的配置。每个都将在Claude UI中显示自己的名称,以便于识别。

建筑

graph TD
    subgraph "Windows Machine"
        Claude[Claude Desktop App]
        MCP[MCP Server<br/>Node.js Process]
        SSH2[SSH2 Library<br/>Persistent Connection]
        
        Claude -->|MCP Protocol<br/>stdio| MCP
        MCP -->|uses| SSH2
    end
    
    subgraph "Ubuntu Server ubuntupc"
        SSH_Daemon[SSH Daemon<br/>sshd]
        Wrapper[Optional Wrapper<br/>srt/timeout/direct]
        Shell[Bash Shell]
        
        SSH_Daemon -->|spawns| Shell
        Shell -->|may wrap via| Wrapper
        Wrapper -->|executes| Commands[Commands & Programs]
    end
    
    SSH2 -->|SSH Connection<br/>Port 22<br/>PERSISTENT| SSH_Daemon
    SSH_Daemon -->|stdout/stderr| SSH2
    SSH2 -->|results| MCP
    MCP -->|JSON-RPC| Claude

    style Claude fill:#e1f5ff
    style MCP fill:#fff4e1
    style SSH2 fill:#ffe1e1
    style SSH_Daemon fill:#e1ffe1
    style Wrapper fill:#fff9e1
    style Shell fill:#f0f0f0
Claude Desktop (Windows)
  → MCP Server (Node.js on Windows)
    → SSH2 library
      → SSH connection to remote server
        → [Optional wrapper command]
          → Actual command execution

SRT包装器示例:

User asks: "list files"
  → Tool call: command(command="ls -la")
    → Server wraps: srt 'ls -la'
      → SSH executes on remote: srt 'ls -la'
        → SRT applies policy, spawns bubblewrap
          → Sandboxed bash executes: ls -la

工具定义

姓名: 可通过以下方式配置 tool_name 参数(默认为包名)

参数:

  • command (string,必填):要执行的命令

行为:

  • 检查交互式命令(拒绝vim、top、不带args的sudo等)
  • 如果已配置,则应用包装器
  • 通过持久SSH连接执行
  • 返回stdout、stderr和退出代码

文件

  • manifest.json -MCP包定义
  • server/index.js -MCP服务器实现
  • package.json -Node.js依赖关系
  • build.sh -生成用于创建命名包的脚本
  • INSTALLATION.md -详细的设置指南(以SRT为重点)
  • COMPARISON.md -标准与SRT比较
  • QUICKSTART.md -5分钟设置

SRT安全

使用时 srt 包装:

  1. 在远程系统上安装必备组件:
sudo apt install bubblewrap
sudo chmod u+s /usr/bin/bwrap
npm install -g @anthropic-ai/sandbox-runtime
  1. 创建策略文件(~/.srt-settings.json):
{
  "filesystem": {
    "denyRead": ["~/.ssh/id_rsa", "~/.ssh/id_ed25519", "~/.srt-settings.json"],
    "allowWrite": ["~/projects", "/tmp"],
    "denyWrite": ["/etc", "/usr", "~/.ssh", "~/.srt-settings.json"]
  },
  "network": {
    "allowedDomains": ["github.com", "pypi.org"],
    "deniedDomains": []
  }
}
  1. 测试SRT:
srt 'ls -la'                    # Should work
srt 'cat ~/.ssh/id_ed25519'     # Should be blocked

⚠️ 严重SRT安全警告

默认SRT配置存在安全漏洞:默认情况下,SRT不会阻止对其自己的配置文件的访问。如果没有正确的配置,Claude可以修改 ~/.srt-settings.json 逃离沙箱。

所需保护:

{
  "filesystem": {
    "denyRead": ["~/.srt-settings.json"],
    "denyWrite": ["~/.srt-settings.json"]
  }
}

验证测试:

# This should be BLOCKED
srt 'cat ~/.srt-settings.json'
srt 'echo "malicious" >> ~/.srt-settings.json'

如果这些命令成功,你的沙盒就会受到威胁。SRT必须拒绝对其自己的配置文件进行读写访问,以防止逃逸。

参考:参见 拟人沙盒运行时 有关SRT配置和安全考虑的更多详细信息。

有关完整的设置说明,请参阅INSTALLATION.md。

版本历史记录

  • 3.1.0 -可配置工具名称

    • 添加 --tool-name Claude UI中自定义工具名称的参数
    • 生成脚本自动设置工具名称以匹配包名称
    • 帮助区分多个SSH服务器实例
  • 3.0.0 -具有可配置包装器的通用SSH

    • 工具重命名自 bash 到 command
    • 添加了可配置的包装器字段
    • 用于创建多个命名包的构建脚本
  • 2.1.0 -SRT特定版本(已弃用)

    • 硬编码SRT包装
  • 2.0.0 -持久SSH2连接

    • 带有SSH2的原始ubuntu shell mcp

许可证

MIT许可证

作者

Carlos-BlockSecCA