项目简介
本项目 'mcp-server-ssh' 是一个 MCP 服务器的实现,它通过 SSH 协议为大型语言模型(LLM)客户端提供远程服务器的访问能力。借助此服务器,LLM 可以安全地执行远程命令、上传下载文件以及进行目录操作,从而扩展 LLM 在自动化运维、远程控制等方面的应用场景。
主要功能点
- 安全的SSH连接管理: 支持安全的 SSH 连接建立和管理。
- 多种身份验证方式: 支持密码和密钥两种 SSH 身份验证方式。
- 远程命令执行: 允许 LLM 客户端在远程服务器上执行命令并获取结果。
- 文件操作: 支持文件上传、下载、查看目录等文件管理功能。
- 进度跟踪: 在文件传输过程中提供进度跟踪信息。
- 详细日志: 提供详细的日志记录,方便问题排查和审计。
安装步骤
-
安装软件包: 首先,确保你的环境中已安装 Node.js 和 npm。然后,通过 npm 安装 'mcp-ssh' 软件包:
npm install mcp-ssh -
配置 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' 服务即可。
信息
分类
开发者工具