项目简介

本项目 'mcp-server-ssh' 是一个 MCP 服务器的实现,它通过 SSH 协议为大型语言模型(LLM)客户端提供远程服务器的访问能力。借助此服务器,LLM 可以安全地执行远程命令、上传下载文件以及进行目录操作,从而扩展 LLM 在自动化运维、远程控制等方面的应用场景。

主要功能点

  • 安全的SSH连接管理: 支持安全的 SSH 连接建立和管理。
  • 多种身份验证方式: 支持密码和密钥两种 SSH 身份验证方式。
  • 远程命令执行: 允许 LLM 客户端在远程服务器上执行命令并获取结果。
  • 文件操作: 支持文件上传、下载、查看目录等文件管理功能。
  • 进度跟踪: 在文件传输过程中提供进度跟踪信息。
  • 详细日志: 提供详细的日志记录,方便问题排查和审计。

安装步骤

  1. 安装软件包: 首先,确保你的环境中已安装 Node.js 和 npm。然后,通过 npm 安装 'mcp-ssh' 软件包:

    npm install mcp-ssh
  2. 配置 MCP 客户端: 对于支持 MCP 协议的 LLM 客户端(例如 Claude 桌面版),你需要配置 'claude_desktop_config.json' 文件以启用此 MCP 服务器。将以下 JSON 配置添加到你的 'claude_desktop_config.json' 文件中:

    {
      "mcpServers": {
        "ssh": {
          "command": "node",
          "args": ["%APPDATA%/npm/node_modules/mcp-ssh/dist/server.js"],
          "env": {
            "SSH_PORT": "8889",
            "SSH_LOG_LEVEL": "info"
          }
        }
      }
    }

    配置参数说明:

    • 'server name': 'ssh' (用户自定义,用于在客户端中标识该服务器)
    • 'command': 'node' (启动服务器的命令,这里使用 Node.js)
    • 'args': '["%APPDATA%/npm/node_modules/mcp-ssh/dist/server.js"]' (启动服务器的参数,指向 'mcp-ssh' 包的 'server.js' 文件)
    • 'env': 环境变量配置
      • 'SSH_PORT': '"8889"' (服务器监听端口,默认为 8889,可以根据需要修改)
      • 'SSH_LOG_LEVEL': '"info"' (日志级别,默认为 info,可设置为 debug, warn, error 等)

基本使用方法

配置完成后,LLM 客户端应该能够识别并连接到这个 MCP 服务器。以下是一些基本操作示例,展示如何通过 HTTP 请求与服务器交互,从而实现 SSH 功能:

1. 连接到 SSH 服务器: 使用 POST 请求发送连接信息到 '/connect' 接口。你需要提供连接 ID、目标主机、端口、用户名和密码(或密钥)。

  • 密码认证示例 (PowerShell):

    $body = @{
        id = "test"  # 连接 ID,客户端自定义
        host = "example.com"  # 目标 SSH 服务器地址
        port = 22  # SSH 端口,默认为 22
        username = "user"  # SSH 用户名
        password = "pass123"  # SSH 密码
    } | ConvertTo-Json
    
    Invoke-RestMethod -Uri "http://localhost:8889/connect" -Method Post -Body $body -ContentType "application/json"
  • 密钥认证示例 (PowerShell):

    $body = @{
        id = "test" # 连接 ID,客户端自定义
        host = "example.com" # 目标 SSH 服务器地址
        port = 22 # SSH 端口,默认为 22
        username = "user" # SSH 用户名
        privateKey = Get-Content ~/.ssh/id_rsa | Out-String # SSH 私钥内容
        passphrase = "optional-key-passphrase"  # 密钥密码 (如果私钥有密码保护)
    } | ConvertTo-Json
    
    Invoke-RestMethod -Uri "http://localhost:8889/connect" -Method Post -Body $body -ContentType "application/json"

2. 执行远程命令: 使用 POST 请求发送命令到 '/exec' 接口,需要提供连接 ID 和要执行的命令。

  • 执行命令示例 (PowerShell):
    $execBody = @{
        id = "test"  # 连接 ID,与连接时使用的 ID 保持一致
        command = "ls -la"  # 要执行的远程命令
    } | ConvertTo-Json
    
    Invoke-RestMethod -Uri "http://localhost:8889/exec" -Method Post -Body $execBody -ContentType "application/json"

3. 文件上传: 使用 POST 请求发送文件到 '/upload/{id}' 接口,其中 '{id}' 是连接 ID。需要以 'multipart/form-data' 格式上传文件,包含 'file' 字段为本地文件,'remotePath' 字段为远程文件路径。

  • 文件上传示例 (PowerShell):
    $uploadForm = @{
        file = Get-Item -Path "localfile.txt"  # 本地文件路径
        remotePath = "/remote/path/file.txt"  # 远程服务器上的目标路径
    }
    Invoke-RestMethod -Uri "http://localhost:8889/upload/test" -Method Post -Form $uploadForm

4. 文件下载: 使用 GET 请求访问 '/download/{id}' 接口,其中 '{id}' 是连接 ID,并传递 'remotePath' 参数指定要下载的远程文件路径。

  • 文件下载示例 (PowerShell):
    Invoke-RestMethod -Uri "http://localhost:8889/download/test?remotePath=/remote/path/file.txt" -Method Get -OutFile "downloaded.txt" # 下载到本地文件 downloaded.txt

5. 列出目录内容: 使用 GET 请求访问 '/ls/{id}' 接口,其中 '{id}' 是连接 ID,并传递 'path' 参数指定要列出的远程目录路径。

  • 列出目录示例 (PowerShell):
    Invoke-RestMethod -Uri "http://localhost:8889/ls/test?path=/remote/path" -Method Get

6. 获取连接状态: 使用 GET 请求访问 '/status/{id}' 接口,其中 '{id}' 是连接 ID,获取连接的当前状态信息。

  • 获取连接状态示例 (PowerShell):
    Invoke-RestMethod -Uri "http://localhost:8889/status/test" -Method Get

请注意: 以上 PowerShell 示例仅为演示 HTTP 请求的发送方式,实际集成到 LLM 客户端时,客户端会根据 MCP 协议自动与服务器进行通信。你只需要正确配置 MCP 客户端并启动 'mcp-server-ssh' 服务即可。

信息

分类

开发者工具