# SSH Agent MCP 服务
这是一个基于Python的MCP (Model Context Protocol) stdio服务,允许大模型直接操作SSH连接来解决远程服务器问题。支持通过命令行参数或JSON配置文件管理SSH连接,让用户通过简单的JSON配置即可使用。
## 功能特性
- **⚡ uvx支持**: 通过 `uvx ssh-agent-mcp` 一键运行,无需本地安装
- **🔧 命令行参数**: 支持完整的命令行参数配置,无需配置文件
- **🔧 JSON配置管理**: 通过简单的JSON文件管理多个SSH连接
- **🔗 有状态连接管理**: 维护SSH连接状态,支持多个并发连接
- **🔐 多种认证方式**: 支持密码认证、私钥认证和SSH Agent
- **⚡ 命令执行**: 在远程服务器上执行命令并获取输出
- **🔄 异步命令支持**: 支持长时间运行的命令(如top、tail等),实时获取输出
- **🎮 交互式命令支持**: 支持需要用户输入的交互式命令(如sudo、vim、mysql、python等)
- **📊 命令生命周期管理**: 启动、监控、终止和清理异步命令和交互式会话
- **📈 连接状态查询**: 实时查询连接状态和管理连接
- **🚀 自动连接**: 支持启动时自动连接指定的服务器
- **📁 SFTP文件传输**: 支持文件上传、下载和目录操作
- **📂 远程文件管理**: 支持远程目录浏览、创建、删除和重命名
## 🚀 快速开始
### 方法一:uvx 一键运行(推荐)
在Claude Desktop的配置文件中添加:
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--host=192.168.1.100",
        "--user=root",
        "--password=your_password",
        "--timeout=30000"
      ]
    }
  }
}
```
重启Claude Desktop即可使用!
**⭐ 新特性:无参数启动**
MCP服务可以不传入任何SSH连接参数启动,等待大模型通过工具提供连接信息:
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": ["ssh-agent-mcp@latest"]
    }
  }
}
```
启动后,大模型可以使用 `ssh_connect` 或 `ssh_connect_by_name` 工具建立连接。
### 方法二:本地安装
```bash
# 安装
pip install ssh-agent-mcp
# 或从源码安装
git clone https://github.com/yourusername/sshagent.git
cd sshagent
pip install -e .
```
### 方法三:使用配置文件
1. 创建配置文件 `ssh_config.json`:
```json
{
  "connections": [
    {
      "name": "production-server",
      "host": "prod.example.com",
      "username": "admin",
      "private_key": "/home/user/.ssh/id_rsa",
      "tags": ["production"]
    }
  ],
  "auto_connect": ["production-server"]
}
```
2. 在Claude Desktop中配置:
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--config=/path/to/ssh_config.json",
        "--connection=production-server",
        "--auto-connect"
      ]
    }
  }
}
```
## 📝 使用方式
### 方式一:无参数启动(推荐)⭐
最灵活的方式,启动时不传入任何连接参数,由大模型动态管理连接:
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": ["ssh-agent-mcp@latest"]
    }
  }
}
```
**优势**:
- 🔄 **动态连接管理**:大模型可以根据需要连接不同的服务器
- 🛡️ **安全性更高**:不在配置文件中暴露敏感信息
- 🎯 **灵活性强**:支持多服务器切换,适合复杂场景
### 方式二:纯命令行参数
直接在Claude Desktop配置中指定所有参数:
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--host=192.168.1.100",
        "--port=22",
        "--user=root",
        "--password=your_password",
        "--timeout=30000",
        "--max-chars=none"
      ]
    }
  }
}
```
### 方式三:命令行 + 配置文件
结合配置文件和命令行参数:
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--config=/path/to/ssh_config.json",
        "--connection=production-server"
      ]
    }
  }
}
```
### 方式三:使用私钥认证
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--host=prod.example.com",
        "--user=admin",
        "--key=/home/user/.ssh/id_rsa",
        "--key-password=private_key_password"
      ]
    }
  }
}
```
### 方式四:配置文件模式
使用配置文件管理多个连接:
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--config=/path/to/ssh_config.json",
        "--connection=production-server"
      ]
    }
  }
}
```
## 🔧 命令行参数
| 参数 | 描述 | 必需 | 示例 |
|------|------|------|------|
| `--host` | SSH服务器地址 | 否* | `192.168.1.100` |
| `--user`, `--username` | SSH用户名 | 否* | `root` |
| `--port` | SSH端口 | 否 | `22` (默认) |
| `--password` | SSH密码 | 否 | `your_password` |
| `--key`, `--private-key` | 私钥文件路径 | 否 | `/home/user/.ssh/id_rsa` |
| `--key-password`, `--private-key-password` | 私钥密码 | 否 | `key_password` |
| `--config`, `-c` | 配置文件路径 | 否 | `/path/to/config.json` |
| `--connection` | 配置文件中的连接名称 | 否 | `production-server` |
| `--timeout` | 命令超时时间(毫秒) | 否 | `30000` (默认) |
| `--max-chars` | 最大输出字符数 | 否 | `none` (默认) |
| `--log-level` | 日志级别 | 否 | `INFO` (默认) |
| `--auto-connect` | 启动时自动连接 | 否 | - |
**注意**:
- `*` 标记的参数在使用配置文件或无参数启动模式时不是必需的
- 无参数启动时,所有连接参数都是可选的,MCP服务将等待大模型通过工具提供连接信息
## 📋 配置文件格式
当使用配置文件时,`ssh_config.json` 格式如下:
```json
{
  "connections": [
    {
      "name": "production-server",
      "host": "prod.example.com",
      "username": "admin",
      "port": 22,
      "private_key": "/home/user/.ssh/id_rsa",
      "description": "生产环境服务器",
      "tags": ["production", "critical"]
    },
    {
      "name": "dev-server",
      "host": "192.168.1.100",
      "username": "dev",
      "port": 22,
      "password": "dev_password",
      "description": "开发环境服务器",
      "tags": ["development", "test"]
    }
  ],
  "default_timeout": 30,
  "log_level": "INFO",
  "auto_connect": ["production-server"],
  "max_connections": 10
}
```
## 🛠️ MCP工具接口
该服务提供以下MCP工具:
### 基础连接工具
#### 1. ssh_connect_by_name ⭐ 推荐
使用配置文件中的连接名称建立SSH连接
- **参数**:
  - `connection_name` (必需): 配置文件中的连接名称
- **示例**:
```json
{
  "name": "ssh_connect_by_name",
  "arguments": {
    "connection_name": "production-server"
  }
}
```
#### 2. ssh_connect
手动建立SSH连接(不推荐,建议使用配置文件)
- **参数**:
  - `host` (必需): SSH服务器主机名或IP地址
  - `username` (必需): SSH用户名
  - `port` (可选): SSH端口,默认为22
  - `password` (可选): SSH密码
  - `private_key` (可选): 私钥文件路径
  - `private_key_password` (可选): 私钥密码
#### 3. ssh_disconnect
断开SSH连接
- **参数**:
  - `connection_id` (必需): SSH连接ID
#### 4. ssh_disconnect_all
断开所有SSH连接
- **参数**: 无
### 配置管理工具
#### 5. ssh_list_config ⭐ 新功能
列出配置文件中的所有SSH连接
- **参数**:
  - `filter_tag` (可选): 按标签过滤连接
- **示例**:
```json
{
  "name": "ssh_list_config",
  "arguments": {
    "filter_tag": "production"
  }
}
```
#### 6. ssh_auto_connect ⭐ 新功能
自动连接配置文件中标记为auto_connect的连接
- **参数**: 无
### 状态查询工具
#### 7. ssh_status
查询SSH连接状态
- **参数**:
  - `connection_id` (可选): SSH连接ID,不提供则返回所有连接状态
#### 8. ssh_list_connections
列出所有SSH连接
- **参数**: 无
### 命令执行工具
#### 9. ssh_execute
在SSH连接上执行命令
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `command` (必需): 要执行的命令
  - `timeout` (可选): 命令超时时间(秒),默认为30
### 异步命令工具
#### 10. ssh_start_async_command
启动长时间运行的异步命令
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `command` (必需): 要执行的长时间运行命令
#### 11. ssh_get_command_status
获取异步命令状态和最新输出
- **参数**:
  - `command_id` (必需): 异步命令ID
#### 12. ssh_list_async_commands
列出所有异步命令状态
- **参数**: 无
#### 13. ssh_terminate_command
终止正在运行的异步命令
- **参数**:
  - `command_id` (必需): 要终止的异步命令ID
#### 14. ssh_cleanup_commands
清理已完成的异步命令
- **参数**:
  - `max_age` (可选): 保留时间(秒),默认3600秒
### 交互式命令工具 🎮 新功能
#### 15. ssh_start_interactive
启动交互式命令会话,支持需要用户输入的命令
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `command` (必需): 要执行的交互式命令
  - `pty_width` (可选): 伪终端宽度,默认80
  - `pty_height` (可选): 伪终端高度,默认24
- **示例**:
```json
{
  "name": "ssh_start_interactive",
  "arguments": {
    "connection_id": "user@server:22",
    "command": "sudo -i",
    "pty_width": 120,
    "pty_height": 30
  }
}
```
#### 16. ssh_send_input
向交互式会话发送输入
- **参数**:
  - `session_id` (必需): 交互式会话ID
  - `input_text` (必需): 要发送的输入内容
- **示例**:
```json
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session-uuid",
    "input_text": "password123\n"
  }
}
```
#### 17. ssh_get_interactive_output
获取交互式会话的输出
- **参数**:
  - `session_id` (必需): 交互式会话ID
  - `max_lines` (可选): 最大输出行数,默认100
- **示例**:
```json
{
  "name": "ssh_get_interactive_output",
  "arguments": {
    "session_id": "session-uuid",
    "max_lines": 50
  }
}
```
#### 18. ssh_list_interactive_sessions
列出指定连接的所有交互式会话
- **参数**:
  - `connection_id` (可选): SSH连接ID,不提供则返回所有连接的会话
- **示例**:
```json
{
  "name": "ssh_list_interactive_sessions",
  "arguments": {
    "connection_id": "user@server:22"
  }
}
```
#### 19. ssh_terminate_interactive
终止交互式会话
- **参数**:
  - `session_id` (必需): 交互式会话ID
- **示例**:
```json
{
  "name": "ssh_terminate_interactive",
  "arguments": {
    "session_id": "session-uuid"
  }
}
```
#### 20. ssh_connect_by_config_host ⭐ 新功能
使用SSH config文件中的主机名建立连接
- **参数**:
  - `config_host` (必需): SSH config文件中的主机名
  - `username` (可选): 可选用户名,覆盖config中的设置
  - `password` (可选): 可选密码
  - `private_key` (可选): 可选私钥文件路径
  - `private_key_password` (可选): 可选私钥密码
- **示例**:
```json
{
  "name": "ssh_connect_by_config_host",
  "arguments": {
    "config_host": "my-server"
  }
}
```
**优势**:
- 🎯 **简化配置**:直接使用~/.ssh/config中已配置的主机
- 🔗 **自动解析**:SSH客户端自动处理主机名、端口、用户等配置
- 🛡️ **安全性**:利用SSH config的现有安全配置
- 📦 **零配置**:无需额外配置文件,直接使用标准SSH配置
## 📁 SFTP文件传输工具 ⭐ 新功能
#### 21. ssh_upload_file
上传文件到远程服务器
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `local_path` (必需): 本地文件路径
  - `remote_path` (必需): 远程文件路径
- **示例**:
```json
{
  "name": "ssh_upload_file",
  "arguments": {
    "connection_id": "connection-uuid",
    "local_path": "/path/to/local/file.txt",
    "remote_path": "/remote/path/file.txt"
  }
}
```
#### 22. ssh_download_file
从远程服务器下载文件
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `remote_path` (必需): 远程文件路径
  - `local_path` (必需): 本地文件路径
- **示例**:
```json
{
  "name": "ssh_download_file",
  "arguments": {
    "connection_id": "connection-uuid",
    "remote_path": "/remote/path/file.txt",
    "local_path": "/path/to/local/downloaded_file.txt"
  }
}
```
#### 23. ssh_list_remote_directory
列出远程目录内容
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `remote_path` (可选): 远程目录路径,默认为当前目录
- **示例**:
```json
{
  "name": "ssh_list_remote_directory",
  "arguments": {
    "connection_id": "connection-uuid",
    "remote_path": "/home/user/documents"
  }
}
```
#### 24. ssh_create_remote_directory
在远程服务器上创建目录
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `remote_path` (必需): 要创建的远程目录路径
  - `mode` (可选): 目录权限,默认为755
  - `parents` (可选): 是否递归创建父目录,默认为true
- **示例**:
```json
{
  "name": "ssh_create_remote_directory",
  "arguments": {
    "connection_id": "connection-uuid",
    "remote_path": "/remote/new/directory",
    "mode": 755,
    "parents": true
  }
}
```
#### 25. ssh_remove_remote_file
删除远程文件或目录
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `remote_path` (必需): 要删除的远程文件或目录路径
- **示例**:
```json
{
  "name": "ssh_remove_remote_file",
  "arguments": {
    "connection_id": "connection-uuid",
    "remote_path": "/remote/path/to/delete"
  }
}
```
#### 26. ssh_get_remote_file_info
获取远程文件或目录信息
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `remote_path` (必需): 远程文件或目录路径
- **示例**:
```json
{
  "name": "ssh_get_remote_file_info",
  "arguments": {
    "connection_id": "connection-uuid",
    "remote_path": "/remote/path/file.txt"
  }
}
```
#### 27. ssh_rename_remote_path
重命名远程文件或目录
- **参数**:
  - `connection_id` (必需): SSH连接ID
  - `old_path` (必需): 原始路径
  - `new_path` (必需): 新路径
- **示例**:
```json
{
  "name": "ssh_rename_remote_path",
  "arguments": {
    "connection_id": "connection-uuid",
    "old_path": "/remote/old_name.txt",
    "new_path": "/remote/new_name.txt"
  }
}
```
## 📖 使用示例
### 启动MCP服务
```bash
python main.py
```
### 🌟 无参数启动工作流程(推荐)
**适用场景**:动态连接管理,多服务器操作,安全性要求高的环境
1. **手动建立连接**:
```json
{
  "name": "ssh_connect",
  "arguments": {
    "host": "192.168.1.100",
    "username": "admin",
    "password": "secure_password"
  }
}
```
2. **查看连接状态**:
```json
{
  "name": "ssh_list_connections",
  "arguments": {}
}
```
3. **执行命令**:
```json
{
  "name": "ssh_execute",
  "arguments": {
    "connection_id": "admin@192.168.1.100:22",
    "command": "systemctl status nginx"
  }
}
```
4. **连接其他服务器**:
```json
{
  "name": "ssh_connect",
  "arguments": {
    "host": "prod.example.com",
    "username": "root",
    "private_key": "/home/user/.ssh/id_rsa"
  }
}
```
### 🎯 配置文件工作流程
**适用场景**:固定服务器环境,批量操作,团队协作
1. **查看配置的连接**:
```json
{
  "name": "ssh_list_config",
  "arguments": {}
}
```
2. **通过名称建立连接**:
```json
{
  "name": "ssh_connect_by_name",
  "arguments": {
    "connection_name": "production-server"
  }
}
```
3. **执行命令**:
```json
{
  "name": "ssh_execute",
  "arguments": {
    "connection_id": "admin@prod.example.com:22",
    "command": "df -h"
  }
}
```
4. **断开连接**:
```json
{
  "name": "ssh_disconnect",
  "arguments": {
    "connection_id": "admin@prod.example.com:22"
  }
}
```
### 🏠 SSH Config工作流程 ⭐ 新功能
**适用场景**:已有SSH config配置,利用标准SSH配置文件
假设你的 `~/.ssh/config` 文件中有以下配置:
```bash
Host my-server
    HostName 192.168.1.100
    User admin
    Port 22
    IdentityFile ~/.ssh/id_rsa
Host production
    HostName prod.example.com
    User root
    Port 2222
    IdentityFile ~/.ssh/prod_key
```
1. **使用SSH config主机名建立连接**:
```json
{
  "name": "ssh_connect_by_config_host",
  "arguments": {
    "config_host": "my-server"
  }
}
```
2. **覆盖config中的用户名**:
```json
{
  "name": "ssh_connect_by_config_host",
  "arguments": {
    "config_host": "production",
    "username": "deploy"
  }
}
```
3. **使用密码覆盖config中的私钥认证**:
```json
{
  "name": "ssh_connect_by_config_host",
  "arguments": {
    "config_host": "my-server",
    "password": "temporary_password"
  }
}
```
4. **查看连接状态**:
```json
{
  "name": "ssh_status",
  "arguments": {}
}
```
5. **执行命令**:
```json
{
  "name": "ssh_execute",
  "arguments": {
    "connection_id": "my-server",
    "command": "hostname"
  }
}
```
**优势**:
- 🎯 **零配置**:直接使用已有的SSH config配置
- 🔗 **自动解析**:自动处理主机名、端口、用户名、私钥等
- 🛡️ **安全性**:利用SSH config的现有安全设置
- 📦 **标准化**:遵循SSH标准配置约定
### 🚀 自动连接工作流程
1. **启动时自动连接所有标记的服务器**:
```json
{
  "name": "ssh_auto_connect",
  "arguments": {}
}
```
2. **查看所有连接状态**:
```json
{
  "name": "ssh_status",
  "arguments": {}
}
```
### 🔄 异步命令工作流程
1. **启动长时间运行命令**:
```json
{
  "name": "ssh_start_async_command",
  "arguments": {
    "connection_id": "admin@prod.example.com:22",
    "command": "tail -f /var/log/nginx/access.log"
  }
}
```
2. **查询命令状态和输出**:
```json
{
  "name": "ssh_get_command_status",
  "arguments": {
    "command_id": "返回的命令UUID"
  }
}
```
3. **终止长时间运行命令**:
```json
{
  "name": "ssh_terminate_command",
  "arguments": {
    "command_id": "要终止的命令UUID"
  }
}
```
### 🎮 交互式命令工作流程
交互式命令支持让大模型能够与需要用户输入的命令进行实时交互,如 `sudo`、`vim`、`mysql`、`python` 等。
#### 基本交互式会话
1. **启动交互式会话**:
```json
{
  "name": "ssh_start_interactive",
  "arguments": {
    "connection_id": "admin@prod.example.com:22",
    "command": "bash",
    "pty_width": 80,
    "pty_height": 24
  }
}
```
2. **发送命令到会话**:
```json
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "返回的会话UUID",
    "input_text": "ls -la\n"
  }
}
```
3. **获取会话输出**:
```json
{
  "name": "ssh_get_interactive_output",
  "arguments": {
    "session_id": "会话UUID",
    "max_lines": 50
  }
}
```
4. **终止交互式会话**:
```json
{
  "name": "ssh_terminate_interactive",
  "arguments": {
    "session_id": "会话UUID"
  }
}
```
#### 高级交互式场景
**1. sudo 命令交互**:
```json
// 启动交互式会话
{
  "name": "ssh_start_interactive",
  "arguments": {
    "connection_id": "user@server:22",
    "command": "sudo -i"
  }
}
// 发送密码
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "your_password\n"
  }
}
// 执行管理员命令
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "systemctl status nginx\n"
  }
}
```
**2. Python 交互式环境**:
```json
// 启动Python解释器
{
  "name": "ssh_start_interactive",
  "arguments": {
    "connection_id": "dev@server:22",
    "command": "python3"
  }
}
// 执行Python代码
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "import os\nprint(os.getcwd())\n"
  }
}
```
**3. 文本编辑器 (vim/nano)**:
```json
// 启动vim编辑器
{
  "name": "ssh_start_interactive",
  "arguments": {
    "connection_id": "user@server:22",
    "command": "vim /etc/hosts",
    "pty_width": 120,
    "pty_height": 30
  }
}
// 进入插入模式
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "i"
  }
}
// 输入内容
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "127.0.0.1 localhost\n"
  }
}
// 保存并退出
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "\u001b:wq\n"
  }
}
```
**4. 数据库交互 (MySQL)**:
```json
// 连接MySQL
{
  "name": "ssh_start_interactive",
  "arguments": {
    "connection_id": "db@server:22",
    "command": "mysql -u root -p"
  }
}
// 输入密码
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "database_password\n"
  }
}
// 执行SQL查询
{
  "name": "ssh_send_input",
  "arguments": {
    "session_id": "session_uuid",
    "input_text": "SHOW DATABASES;\n"
  }
}
```
#### 交互式会话管理
**查看所有活跃会话**:
```json
{
  "name": "ssh_list_interactive_sessions",
  "arguments": {
    "connection_id": "user@server:22"
  }
}
```
#### 交互式命令最佳实践
1. **PTY 尺寸设置**:
   - 对于文本编辑器,建议使用较大的终端尺寸 (120x30)
   - 对于简单命令交互,默认尺寸 (80x24) 即可
2. **输入格式**:
   - 命令结尾添加 `\n` 表示回车
   - 特殊键使用转义序列,如 ESC 键: `\u001b`
   - Ctrl+C: `\u0003`, Ctrl+D: `\u0004`
3. **输出缓冲**:
   - 定期获取输出避免缓冲区溢出
   - 使用 `max_lines` 参数控制输出量
   - 对于大量输出,分批获取
4. **会话清理**:
   - 及时终止不需要的会话
   - 避免长时间保持空闲会话
   - 连接断开时会自动清理相关会话
5. **错误处理**:
   - 检查会话状态,处理会话异常终止
   - 对于需要密码的命令,准备好凭据
   - 处理命令执行超时情况
### 🏷️ 标签过滤示例
1. **查看所有生产环境连接**:
```json
{
  "name": "ssh_list_config",
  "arguments": {
    "filter_tag": "production"
  }
}
```
2. **查看所有开发环境连接**:
```json
{
  "name": "ssh_list_config",
  "arguments": {
    "filter_tag": "development"
  }
}
```
## 🔗 连接ID格式
连接ID格式为: `username@host:port`
例如: `admin@prod.example.com:22`
## 📦 打包和分发
### 创建分发包
```bash
# 构建所有包格式
python build.py --all
# 仅构建wheel包
python build.py --wheel
# 仅创建便携式包
python build.py --portable
```
### 便携式包使用
1. 下载 `ssh-agent-mcp-portable.zip`
2. 解压到目标目录
3. 安装依赖: `pip install -r requirements.txt`
4. 配置SSH连接: 复制并编辑 `ssh_config.json`
5. 启动服务: `python start_ssh_agent.py`
## 安全注意事项
- 请确保SSH凭据的安全,避免在日志中暴露敏感信息
- 建议使用私钥认证而非密码认证
- 在生产环境中考虑使用SSH代理转发
- 定期轮换SSH密钥和密码
## 错误处理
服务包含完善的错误处理机制:
- 连接失败时会返回详细的错误信息
- 命令执行失败时会返回退出码和错误输出
- 支持连接超时和命令执行超时
## 测试
运行测试脚本验证功能:
### 基础功能测试
```bash
python simple_test.py
```
### MCP协议测试
```bash
python test_mcp.py
```
### 交互式命令测试
```bash
# 测试SSH Manager的交互式功能
python test_interactive.py
# 测试MCP交互式工具
python test_mcp_interactive.py
```
## 📁 项目结构
```
sshagent/
├── main.py              # 主入口文件
├── mcp_server.py        # MCP服务器实现
├── ssh_manager.py       # SSH连接管理器
├── config_loader.py     # 配置文件加载器
├── install.py           # 安装脚本
├── build.py             # 打包脚本
├── pyproject.toml       # 项目配置
├── README.md            # 说明文档
├── simple_test.py       # 简单测试脚本
├── test_mcp.py          # MCP协议测试
├── test_interactive.py  # 交互式命令测试脚本
├── test_mcp_interactive.py # MCP交互式工具测试
└── ssh_config.json      # SSH连接配置文件(用户创建)
```
## 📚 依赖项
- `mcp`: Model Context Protocol实现
- `paramiko`: SSH客户端库
- `pydantic`: 数据验证和序列化
- `asyncio`: 异步IO支持
## 🔧 Claude Desktop配置
### 配置文件位置
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%/Claude/claude_desktop_config.json`
- **Linux**: `~/.config/claude-desktop/claude_desktop_config.json`
### 基本配置示例
```json
{
  "mcpServers": {
    "ssh-mcp": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--host=192.168.1.100",
        "--user=root",
        "--password=your_password"
      ]
    }
  }
}
```
### 多服务器配置
```json
{
  "mcpServers": {
    "ssh-prod": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--config=/path/to/prod_config.json",
        "--connection=prod-server",
        "--auto-connect"
      ]
    },
    "ssh-dev": {
      "command": "uvx",
      "args": [
        "ssh-agent-mcp@latest",
        "--host=192.168.1.200",
        "--user=dev",
        "--password=dev_password"
      ]
    }
  }
}
```
### 配置说明
- `uvx`: Python包运行器,会自动下载并运行指定版本的包
- `ssh-agent-mcp@latest`: 使用最新版本,也可以指定具体版本如 `@0.1.0`
- 命令行参数会覆盖配置文件中的相应设置
- 使用 `--auto-connect` 可以在启动时自动建立SSH连接
### 更多配置示例
查看 `claude_desktop_config_examples.json` 文件获取更多配置示例。
### 📁 SFTP文件传输示例
**1. 上传文件到远程服务器**:
```json
{
  "name": "ssh_upload_file",
  "arguments": {
    "connection_id": "user@server:22",
    "local_path": "/home/user/documents/report.pdf",
    "remote_path": "/remote/uploads/report.pdf"
  }
}
```
**2. 从远程服务器下载文件**:
```json
{
  "name": "ssh_download_file",
  "arguments": {
    "connection_id": "user@server:22",
    "remote_path": "/remote/data/backup.zip",
    "local_path": "/home/user/downloads/backup.zip"
  }
}
```
**3. 浏览远程目录**:
```json
{
  "name": "ssh_list_remote_directory",
  "arguments": {
    "connection_id": "user@server:22",
    "remote_path": "/home/user/documents"
  }
}
```
**4. 创建远程目录**:
```json
{
  "name": "ssh_create_remote_directory",
  "arguments": {
    "connection_id": "user@server:22",
    "remote_path": "/remote/new/project",
    "mode": 755,
    "parents": true
  }
}
```
**5. 批量文件操作工作流**:
```json
// 1. 创建远程目录
{
  "name": "ssh_create_remote_directory",
  "arguments": {
    "connection_id": "user@server:22",
    "remote_path": "/remote/backup/2024-01-15"
  }
}
// 2. 上传多个文件
{
  "name": "ssh_upload_file",
  "arguments": {
    "connection_id": "user@server:22",
    "local_path": "/home/user/data/file1.txt",
    "remote_path": "/remote/backup/2024-01-15/file1.txt"
  }
}
// 3. 列出上传的文件
{
  "name": "ssh_list_remote_directory",
  "arguments": {
    "connection_id": "user@server:22",
    "remote_path": "/remote/backup/2024-01-15"
  }
}
```
**6. 远程文件管理**:
```json
// 获取文件信息
{
  "name": "ssh_get_remote_file_info",
  "arguments": {
    "connection_id": "user@server:22",
    "remote_path": "/remote/logs/app.log"
  }
}
// 重命名文件
{
  "name": "ssh_rename_remote_path",
  "arguments": {
    "connection_id": "user@server:22",
    "old_path": "/remote/logs/app.log",
    "new_path": "/remote/logs/app_backup.log"
  }
}
// 删除旧文件
{
  "name": "ssh_remove_remote_file",
  "arguments": {
    "connection_id": "user@server:22",
    "remote_path": "/remote/logs/old_app.log"
  }
}
```
## 🚨 安全注意事项
- 🔐 请确保SSH凭据的安全,避免在日志中暴露敏感信息
- 🔑 建议使用私钥认证而非密码认证
- 🛡️ 在生产环境中考虑使用SSH代理转发
- 🔄 定期轮换SSH密钥和密码
- 📝 不要将包含密码的配置文件提交到版本控制系统
## 🐛 故障排除
### 常见问题
1. **连接失败**
   - 检查SSH服务器地址和端口
   - 验证用户名和密码/私钥
   - 确认SSH服务正在运行
2. **私钥认证失败**
   - 检查私钥文件路径
   - 确认私钥权限正确(600)
   - 如果私钥有密码,请提供private_key_password
3. **配置文件错误**
   - 验证JSON格式是否正确
   - 检查必需字段是否填写
   - 查看日志获取详细错误信息
4. **MCP服务器无法启动**
   - 检查Python环境和依赖
   - 确认配置文件路径正确
   - 查看错误日志
### 调试模式
设置环境变量启用调试日志:
```bash
export SSH_LOG_LEVEL=DEBUG
python main.py
```
## 🤝 贡献
欢迎提交Issue和Pull Request!
## 📄 许可证
MIT License
            
         
        Raw data
        
            {
    "_id": null,
    "home_page": "https://github.com/zhijun/ssh-mcp",
    "name": "ssh-agent-mcp",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.12",
    "maintainer_email": null,
    "keywords": "mcp, ssh, remote, automation, claude, sftp, file-transfer",
    "author": "Your Name",
    "author_email": "Your Name <your.email@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/10/9f/bb890f6679e58a98084937a197a6b5290baffe7e6045139ef5829cd1d349/ssh_agent_mcp-0.3.2.tar.gz",
    "platform": null,
    "description": "# SSH Agent MCP \u670d\u52a1\n\n\u8fd9\u662f\u4e00\u4e2a\u57fa\u4e8ePython\u7684MCP (Model Context Protocol) stdio\u670d\u52a1\uff0c\u5141\u8bb8\u5927\u6a21\u578b\u76f4\u63a5\u64cd\u4f5cSSH\u8fde\u63a5\u6765\u89e3\u51b3\u8fdc\u7a0b\u670d\u52a1\u5668\u95ee\u9898\u3002\u652f\u6301\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6216JSON\u914d\u7f6e\u6587\u4ef6\u7ba1\u7406SSH\u8fde\u63a5\uff0c\u8ba9\u7528\u6237\u901a\u8fc7\u7b80\u5355\u7684JSON\u914d\u7f6e\u5373\u53ef\u4f7f\u7528\u3002\n\n## \u529f\u80fd\u7279\u6027\n\n- **\u26a1 uvx\u652f\u6301**: \u901a\u8fc7 `uvx ssh-agent-mcp` \u4e00\u952e\u8fd0\u884c\uff0c\u65e0\u9700\u672c\u5730\u5b89\u88c5\n- **\ud83d\udd27 \u547d\u4ee4\u884c\u53c2\u6570**: \u652f\u6301\u5b8c\u6574\u7684\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\uff0c\u65e0\u9700\u914d\u7f6e\u6587\u4ef6\n- **\ud83d\udd27 JSON\u914d\u7f6e\u7ba1\u7406**: \u901a\u8fc7\u7b80\u5355\u7684JSON\u6587\u4ef6\u7ba1\u7406\u591a\u4e2aSSH\u8fde\u63a5\n- **\ud83d\udd17 \u6709\u72b6\u6001\u8fde\u63a5\u7ba1\u7406**: \u7ef4\u62a4SSH\u8fde\u63a5\u72b6\u6001\uff0c\u652f\u6301\u591a\u4e2a\u5e76\u53d1\u8fde\u63a5\n- **\ud83d\udd10 \u591a\u79cd\u8ba4\u8bc1\u65b9\u5f0f**: \u652f\u6301\u5bc6\u7801\u8ba4\u8bc1\u3001\u79c1\u94a5\u8ba4\u8bc1\u548cSSH Agent\n- **\u26a1 \u547d\u4ee4\u6267\u884c**: \u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u6267\u884c\u547d\u4ee4\u5e76\u83b7\u53d6\u8f93\u51fa\n- **\ud83d\udd04 \u5f02\u6b65\u547d\u4ee4\u652f\u6301**: \u652f\u6301\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u547d\u4ee4\uff08\u5982top\u3001tail\u7b49\uff09\uff0c\u5b9e\u65f6\u83b7\u53d6\u8f93\u51fa\n- **\ud83c\udfae \u4ea4\u4e92\u5f0f\u547d\u4ee4\u652f\u6301**: \u652f\u6301\u9700\u8981\u7528\u6237\u8f93\u5165\u7684\u4ea4\u4e92\u5f0f\u547d\u4ee4\uff08\u5982sudo\u3001vim\u3001mysql\u3001python\u7b49\uff09\n- **\ud83d\udcca \u547d\u4ee4\u751f\u547d\u5468\u671f\u7ba1\u7406**: \u542f\u52a8\u3001\u76d1\u63a7\u3001\u7ec8\u6b62\u548c\u6e05\u7406\u5f02\u6b65\u547d\u4ee4\u548c\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\n- **\ud83d\udcc8 \u8fde\u63a5\u72b6\u6001\u67e5\u8be2**: \u5b9e\u65f6\u67e5\u8be2\u8fde\u63a5\u72b6\u6001\u548c\u7ba1\u7406\u8fde\u63a5\n- **\ud83d\ude80 \u81ea\u52a8\u8fde\u63a5**: \u652f\u6301\u542f\u52a8\u65f6\u81ea\u52a8\u8fde\u63a5\u6307\u5b9a\u7684\u670d\u52a1\u5668\n- **\ud83d\udcc1 SFTP\u6587\u4ef6\u4f20\u8f93**: \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u3001\u4e0b\u8f7d\u548c\u76ee\u5f55\u64cd\u4f5c\n- **\ud83d\udcc2 \u8fdc\u7a0b\u6587\u4ef6\u7ba1\u7406**: \u652f\u6301\u8fdc\u7a0b\u76ee\u5f55\u6d4f\u89c8\u3001\u521b\u5efa\u3001\u5220\u9664\u548c\u91cd\u547d\u540d\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u65b9\u6cd5\u4e00\uff1auvx \u4e00\u952e\u8fd0\u884c\uff08\u63a8\u8350\uff09\n\n\u5728Claude Desktop\u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\u6dfb\u52a0\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--host=192.168.1.100\",\n        \"--user=root\",\n        \"--password=your_password\",\n        \"--timeout=30000\"\n      ]\n    }\n  }\n}\n```\n\n\u91cd\u542fClaude Desktop\u5373\u53ef\u4f7f\u7528\uff01\n\n**\u2b50 \u65b0\u7279\u6027\uff1a\u65e0\u53c2\u6570\u542f\u52a8**\n\nMCP\u670d\u52a1\u53ef\u4ee5\u4e0d\u4f20\u5165\u4efb\u4f55SSH\u8fde\u63a5\u53c2\u6570\u542f\u52a8\uff0c\u7b49\u5f85\u5927\u6a21\u578b\u901a\u8fc7\u5de5\u5177\u63d0\u4f9b\u8fde\u63a5\u4fe1\u606f\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"ssh-agent-mcp@latest\"]\n    }\n  }\n}\n```\n\n\u542f\u52a8\u540e\uff0c\u5927\u6a21\u578b\u53ef\u4ee5\u4f7f\u7528 `ssh_connect` \u6216 `ssh_connect_by_name` \u5de5\u5177\u5efa\u7acb\u8fde\u63a5\u3002\n\n### \u65b9\u6cd5\u4e8c\uff1a\u672c\u5730\u5b89\u88c5\n\n```bash\n# \u5b89\u88c5\npip install ssh-agent-mcp\n\n# \u6216\u4ece\u6e90\u7801\u5b89\u88c5\ngit clone https://github.com/yourusername/sshagent.git\ncd sshagent\npip install -e .\n```\n\n### \u65b9\u6cd5\u4e09\uff1a\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\n\n1. \u521b\u5efa\u914d\u7f6e\u6587\u4ef6 `ssh_config.json`:\n```json\n{\n  \"connections\": [\n    {\n      \"name\": \"production-server\",\n      \"host\": \"prod.example.com\",\n      \"username\": \"admin\",\n      \"private_key\": \"/home/user/.ssh/id_rsa\",\n      \"tags\": [\"production\"]\n    }\n  ],\n  \"auto_connect\": [\"production-server\"]\n}\n```\n\n2. \u5728Claude Desktop\u4e2d\u914d\u7f6e:\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--config=/path/to/ssh_config.json\",\n        \"--connection=production-server\",\n        \"--auto-connect\"\n      ]\n    }\n  }\n}\n```\n\n## \ud83d\udcdd \u4f7f\u7528\u65b9\u5f0f\n\n### \u65b9\u5f0f\u4e00\uff1a\u65e0\u53c2\u6570\u542f\u52a8\uff08\u63a8\u8350\uff09\u2b50\n\n\u6700\u7075\u6d3b\u7684\u65b9\u5f0f\uff0c\u542f\u52a8\u65f6\u4e0d\u4f20\u5165\u4efb\u4f55\u8fde\u63a5\u53c2\u6570\uff0c\u7531\u5927\u6a21\u578b\u52a8\u6001\u7ba1\u7406\u8fde\u63a5\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"ssh-agent-mcp@latest\"]\n    }\n  }\n}\n```\n\n**\u4f18\u52bf**\uff1a\n- \ud83d\udd04 **\u52a8\u6001\u8fde\u63a5\u7ba1\u7406**\uff1a\u5927\u6a21\u578b\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fde\u63a5\u4e0d\u540c\u7684\u670d\u52a1\u5668\n- \ud83d\udee1\ufe0f **\u5b89\u5168\u6027\u66f4\u9ad8**\uff1a\u4e0d\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u66b4\u9732\u654f\u611f\u4fe1\u606f\n- \ud83c\udfaf **\u7075\u6d3b\u6027\u5f3a**\uff1a\u652f\u6301\u591a\u670d\u52a1\u5668\u5207\u6362\uff0c\u9002\u5408\u590d\u6742\u573a\u666f\n\n### \u65b9\u5f0f\u4e8c\uff1a\u7eaf\u547d\u4ee4\u884c\u53c2\u6570\n\n\u76f4\u63a5\u5728Claude Desktop\u914d\u7f6e\u4e2d\u6307\u5b9a\u6240\u6709\u53c2\u6570\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--host=192.168.1.100\",\n        \"--port=22\",\n        \"--user=root\",\n        \"--password=your_password\",\n        \"--timeout=30000\",\n        \"--max-chars=none\"\n      ]\n    }\n  }\n}\n```\n\n### \u65b9\u5f0f\u4e09\uff1a\u547d\u4ee4\u884c + \u914d\u7f6e\u6587\u4ef6\n\n\u7ed3\u5408\u914d\u7f6e\u6587\u4ef6\u548c\u547d\u4ee4\u884c\u53c2\u6570\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--config=/path/to/ssh_config.json\",\n        \"--connection=production-server\"\n      ]\n    }\n  }\n}\n```\n\n### \u65b9\u5f0f\u4e09\uff1a\u4f7f\u7528\u79c1\u94a5\u8ba4\u8bc1\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--host=prod.example.com\",\n        \"--user=admin\",\n        \"--key=/home/user/.ssh/id_rsa\",\n        \"--key-password=private_key_password\"\n      ]\n    }\n  }\n}\n```\n\n### \u65b9\u5f0f\u56db\uff1a\u914d\u7f6e\u6587\u4ef6\u6a21\u5f0f\n\n\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u7ba1\u7406\u591a\u4e2a\u8fde\u63a5\uff1a\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--config=/path/to/ssh_config.json\",\n        \"--connection=production-server\"\n      ]\n    }\n  }\n}\n```\n\n## \ud83d\udd27 \u547d\u4ee4\u884c\u53c2\u6570\n\n| \u53c2\u6570 | \u63cf\u8ff0 | \u5fc5\u9700 | \u793a\u4f8b |\n|------|------|------|------|\n| `--host` | SSH\u670d\u52a1\u5668\u5730\u5740 | \u5426* | `192.168.1.100` |\n| `--user`, `--username` | SSH\u7528\u6237\u540d | \u5426* | `root` |\n| `--port` | SSH\u7aef\u53e3 | \u5426 | `22` (\u9ed8\u8ba4) |\n| `--password` | SSH\u5bc6\u7801 | \u5426 | `your_password` |\n| `--key`, `--private-key` | \u79c1\u94a5\u6587\u4ef6\u8def\u5f84 | \u5426 | `/home/user/.ssh/id_rsa` |\n| `--key-password`, `--private-key-password` | \u79c1\u94a5\u5bc6\u7801 | \u5426 | `key_password` |\n| `--config`, `-c` | \u914d\u7f6e\u6587\u4ef6\u8def\u5f84 | \u5426 | `/path/to/config.json` |\n| `--connection` | \u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8fde\u63a5\u540d\u79f0 | \u5426 | `production-server` |\n| `--timeout` | \u547d\u4ee4\u8d85\u65f6\u65f6\u95f4\uff08\u6beb\u79d2\uff09 | \u5426 | `30000` (\u9ed8\u8ba4) |\n| `--max-chars` | \u6700\u5927\u8f93\u51fa\u5b57\u7b26\u6570 | \u5426 | `none` (\u9ed8\u8ba4) |\n| `--log-level` | \u65e5\u5fd7\u7ea7\u522b | \u5426 | `INFO` (\u9ed8\u8ba4) |\n| `--auto-connect` | \u542f\u52a8\u65f6\u81ea\u52a8\u8fde\u63a5 | \u5426 | - |\n\n**\u6ce8\u610f**\uff1a\n- `*` \u6807\u8bb0\u7684\u53c2\u6570\u5728\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u6216\u65e0\u53c2\u6570\u542f\u52a8\u6a21\u5f0f\u65f6\u4e0d\u662f\u5fc5\u9700\u7684\n- \u65e0\u53c2\u6570\u542f\u52a8\u65f6\uff0c\u6240\u6709\u8fde\u63a5\u53c2\u6570\u90fd\u662f\u53ef\u9009\u7684\uff0cMCP\u670d\u52a1\u5c06\u7b49\u5f85\u5927\u6a21\u578b\u901a\u8fc7\u5de5\u5177\u63d0\u4f9b\u8fde\u63a5\u4fe1\u606f\n\n## \ud83d\udccb \u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\n\n\u5f53\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u65f6\uff0c`ssh_config.json` \u683c\u5f0f\u5982\u4e0b\uff1a\n\n```json\n{\n  \"connections\": [\n    {\n      \"name\": \"production-server\",\n      \"host\": \"prod.example.com\",\n      \"username\": \"admin\",\n      \"port\": 22,\n      \"private_key\": \"/home/user/.ssh/id_rsa\",\n      \"description\": \"\u751f\u4ea7\u73af\u5883\u670d\u52a1\u5668\",\n      \"tags\": [\"production\", \"critical\"]\n    },\n    {\n      \"name\": \"dev-server\",\n      \"host\": \"192.168.1.100\",\n      \"username\": \"dev\",\n      \"port\": 22,\n      \"password\": \"dev_password\",\n      \"description\": \"\u5f00\u53d1\u73af\u5883\u670d\u52a1\u5668\",\n      \"tags\": [\"development\", \"test\"]\n    }\n  ],\n  \"default_timeout\": 30,\n  \"log_level\": \"INFO\",\n  \"auto_connect\": [\"production-server\"],\n  \"max_connections\": 10\n}\n```\n\n## \ud83d\udee0\ufe0f MCP\u5de5\u5177\u63a5\u53e3\n\n\u8be5\u670d\u52a1\u63d0\u4f9b\u4ee5\u4e0bMCP\u5de5\u5177\uff1a\n\n### \u57fa\u7840\u8fde\u63a5\u5de5\u5177\n\n#### 1. ssh_connect_by_name \u2b50 \u63a8\u8350\n\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8fde\u63a5\u540d\u79f0\u5efa\u7acbSSH\u8fde\u63a5\n- **\u53c2\u6570**:\n  - `connection_name` (\u5fc5\u9700): \u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8fde\u63a5\u540d\u79f0\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_connect_by_name\",\n  \"arguments\": {\n    \"connection_name\": \"production-server\"\n  }\n}\n```\n\n#### 2. ssh_connect\n\u624b\u52a8\u5efa\u7acbSSH\u8fde\u63a5\uff08\u4e0d\u63a8\u8350\uff0c\u5efa\u8bae\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\uff09\n- **\u53c2\u6570**:\n  - `host` (\u5fc5\u9700): SSH\u670d\u52a1\u5668\u4e3b\u673a\u540d\u6216IP\u5730\u5740\n  - `username` (\u5fc5\u9700): SSH\u7528\u6237\u540d\n  - `port` (\u53ef\u9009): SSH\u7aef\u53e3\uff0c\u9ed8\u8ba4\u4e3a22\n  - `password` (\u53ef\u9009): SSH\u5bc6\u7801\n  - `private_key` (\u53ef\u9009): \u79c1\u94a5\u6587\u4ef6\u8def\u5f84\n  - `private_key_password` (\u53ef\u9009): \u79c1\u94a5\u5bc6\u7801\n\n#### 3. ssh_disconnect\n\u65ad\u5f00SSH\u8fde\u63a5\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n\n#### 4. ssh_disconnect_all\n\u65ad\u5f00\u6240\u6709SSH\u8fde\u63a5\n- **\u53c2\u6570**: \u65e0\n\n### \u914d\u7f6e\u7ba1\u7406\u5de5\u5177\n\n#### 5. ssh_list_config \u2b50 \u65b0\u529f\u80fd\n\u5217\u51fa\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6240\u6709SSH\u8fde\u63a5\n- **\u53c2\u6570**:\n  - `filter_tag` (\u53ef\u9009): \u6309\u6807\u7b7e\u8fc7\u6ee4\u8fde\u63a5\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_list_config\",\n  \"arguments\": {\n    \"filter_tag\": \"production\"\n  }\n}\n```\n\n#### 6. ssh_auto_connect \u2b50 \u65b0\u529f\u80fd\n\u81ea\u52a8\u8fde\u63a5\u914d\u7f6e\u6587\u4ef6\u4e2d\u6807\u8bb0\u4e3aauto_connect\u7684\u8fde\u63a5\n- **\u53c2\u6570**: \u65e0\n\n### \u72b6\u6001\u67e5\u8be2\u5de5\u5177\n\n#### 7. ssh_status\n\u67e5\u8be2SSH\u8fde\u63a5\u72b6\u6001\n- **\u53c2\u6570**:\n  - `connection_id` (\u53ef\u9009): SSH\u8fde\u63a5ID\uff0c\u4e0d\u63d0\u4f9b\u5219\u8fd4\u56de\u6240\u6709\u8fde\u63a5\u72b6\u6001\n\n#### 8. ssh_list_connections\n\u5217\u51fa\u6240\u6709SSH\u8fde\u63a5\n- **\u53c2\u6570**: \u65e0\n\n### \u547d\u4ee4\u6267\u884c\u5de5\u5177\n\n#### 9. ssh_execute\n\u5728SSH\u8fde\u63a5\u4e0a\u6267\u884c\u547d\u4ee4\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `command` (\u5fc5\u9700): \u8981\u6267\u884c\u7684\u547d\u4ee4\n  - `timeout` (\u53ef\u9009): \u547d\u4ee4\u8d85\u65f6\u65f6\u95f4\uff08\u79d2\uff09\uff0c\u9ed8\u8ba4\u4e3a30\n\n### \u5f02\u6b65\u547d\u4ee4\u5de5\u5177\n\n#### 10. ssh_start_async_command\n\u542f\u52a8\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u5f02\u6b65\u547d\u4ee4\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `command` (\u5fc5\u9700): \u8981\u6267\u884c\u7684\u957f\u65f6\u95f4\u8fd0\u884c\u547d\u4ee4\n\n#### 11. ssh_get_command_status\n\u83b7\u53d6\u5f02\u6b65\u547d\u4ee4\u72b6\u6001\u548c\u6700\u65b0\u8f93\u51fa\n- **\u53c2\u6570**:\n  - `command_id` (\u5fc5\u9700): \u5f02\u6b65\u547d\u4ee4ID\n\n#### 12. ssh_list_async_commands\n\u5217\u51fa\u6240\u6709\u5f02\u6b65\u547d\u4ee4\u72b6\u6001\n- **\u53c2\u6570**: \u65e0\n\n#### 13. ssh_terminate_command\n\u7ec8\u6b62\u6b63\u5728\u8fd0\u884c\u7684\u5f02\u6b65\u547d\u4ee4\n- **\u53c2\u6570**:\n  - `command_id` (\u5fc5\u9700): \u8981\u7ec8\u6b62\u7684\u5f02\u6b65\u547d\u4ee4ID\n\n#### 14. ssh_cleanup_commands\n\u6e05\u7406\u5df2\u5b8c\u6210\u7684\u5f02\u6b65\u547d\u4ee4\n- **\u53c2\u6570**:\n  - `max_age` (\u53ef\u9009): \u4fdd\u7559\u65f6\u95f4\uff08\u79d2\uff09\uff0c\u9ed8\u8ba43600\u79d2\n\n### \u4ea4\u4e92\u5f0f\u547d\u4ee4\u5de5\u5177 \ud83c\udfae \u65b0\u529f\u80fd\n\n#### 15. ssh_start_interactive\n\u542f\u52a8\u4ea4\u4e92\u5f0f\u547d\u4ee4\u4f1a\u8bdd\uff0c\u652f\u6301\u9700\u8981\u7528\u6237\u8f93\u5165\u7684\u547d\u4ee4\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `command` (\u5fc5\u9700): \u8981\u6267\u884c\u7684\u4ea4\u4e92\u5f0f\u547d\u4ee4\n  - `pty_width` (\u53ef\u9009): \u4f2a\u7ec8\u7aef\u5bbd\u5ea6\uff0c\u9ed8\u8ba480\n  - `pty_height` (\u53ef\u9009): \u4f2a\u7ec8\u7aef\u9ad8\u5ea6\uff0c\u9ed8\u8ba424\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_start_interactive\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"command\": \"sudo -i\",\n    \"pty_width\": 120,\n    \"pty_height\": 30\n  }\n}\n```\n\n#### 16. ssh_send_input\n\u5411\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\u53d1\u9001\u8f93\u5165\n- **\u53c2\u6570**:\n  - `session_id` (\u5fc5\u9700): \u4ea4\u4e92\u5f0f\u4f1a\u8bddID\n  - `input_text` (\u5fc5\u9700): \u8981\u53d1\u9001\u7684\u8f93\u5165\u5185\u5bb9\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session-uuid\",\n    \"input_text\": \"password123\\n\"\n  }\n}\n```\n\n#### 17. ssh_get_interactive_output\n\u83b7\u53d6\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\u7684\u8f93\u51fa\n- **\u53c2\u6570**:\n  - `session_id` (\u5fc5\u9700): \u4ea4\u4e92\u5f0f\u4f1a\u8bddID\n  - `max_lines` (\u53ef\u9009): \u6700\u5927\u8f93\u51fa\u884c\u6570\uff0c\u9ed8\u8ba4100\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_get_interactive_output\",\n  \"arguments\": {\n    \"session_id\": \"session-uuid\",\n    \"max_lines\": 50\n  }\n}\n```\n\n#### 18. ssh_list_interactive_sessions\n\u5217\u51fa\u6307\u5b9a\u8fde\u63a5\u7684\u6240\u6709\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\n- **\u53c2\u6570**:\n  - `connection_id` (\u53ef\u9009): SSH\u8fde\u63a5ID\uff0c\u4e0d\u63d0\u4f9b\u5219\u8fd4\u56de\u6240\u6709\u8fde\u63a5\u7684\u4f1a\u8bdd\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_list_interactive_sessions\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\"\n  }\n}\n```\n\n#### 19. ssh_terminate_interactive\n\u7ec8\u6b62\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\n- **\u53c2\u6570**:\n  - `session_id` (\u5fc5\u9700): \u4ea4\u4e92\u5f0f\u4f1a\u8bddID\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_terminate_interactive\",\n  \"arguments\": {\n    \"session_id\": \"session-uuid\"\n  }\n}\n```\n\n#### 20. ssh_connect_by_config_host \u2b50 \u65b0\u529f\u80fd\n\u4f7f\u7528SSH config\u6587\u4ef6\u4e2d\u7684\u4e3b\u673a\u540d\u5efa\u7acb\u8fde\u63a5\n- **\u53c2\u6570**:\n  - `config_host` (\u5fc5\u9700): SSH config\u6587\u4ef6\u4e2d\u7684\u4e3b\u673a\u540d\n  - `username` (\u53ef\u9009): \u53ef\u9009\u7528\u6237\u540d\uff0c\u8986\u76d6config\u4e2d\u7684\u8bbe\u7f6e\n  - `password` (\u53ef\u9009): \u53ef\u9009\u5bc6\u7801\n  - `private_key` (\u53ef\u9009): \u53ef\u9009\u79c1\u94a5\u6587\u4ef6\u8def\u5f84\n  - `private_key_password` (\u53ef\u9009): \u53ef\u9009\u79c1\u94a5\u5bc6\u7801\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_connect_by_config_host\",\n  \"arguments\": {\n    \"config_host\": \"my-server\"\n  }\n}\n```\n\n**\u4f18\u52bf**\uff1a\n- \ud83c\udfaf **\u7b80\u5316\u914d\u7f6e**\uff1a\u76f4\u63a5\u4f7f\u7528~/.ssh/config\u4e2d\u5df2\u914d\u7f6e\u7684\u4e3b\u673a\n- \ud83d\udd17 **\u81ea\u52a8\u89e3\u6790**\uff1aSSH\u5ba2\u6237\u7aef\u81ea\u52a8\u5904\u7406\u4e3b\u673a\u540d\u3001\u7aef\u53e3\u3001\u7528\u6237\u7b49\u914d\u7f6e\n- \ud83d\udee1\ufe0f **\u5b89\u5168\u6027**\uff1a\u5229\u7528SSH config\u7684\u73b0\u6709\u5b89\u5168\u914d\u7f6e\n- \ud83d\udce6 **\u96f6\u914d\u7f6e**\uff1a\u65e0\u9700\u989d\u5916\u914d\u7f6e\u6587\u4ef6\uff0c\u76f4\u63a5\u4f7f\u7528\u6807\u51c6SSH\u914d\u7f6e\n\n## \ud83d\udcc1 SFTP\u6587\u4ef6\u4f20\u8f93\u5de5\u5177 \u2b50 \u65b0\u529f\u80fd\n\n#### 21. ssh_upload_file\n\u4e0a\u4f20\u6587\u4ef6\u5230\u8fdc\u7a0b\u670d\u52a1\u5668\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `local_path` (\u5fc5\u9700): \u672c\u5730\u6587\u4ef6\u8def\u5f84\n  - `remote_path` (\u5fc5\u9700): \u8fdc\u7a0b\u6587\u4ef6\u8def\u5f84\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_upload_file\",\n  \"arguments\": {\n    \"connection_id\": \"connection-uuid\",\n    \"local_path\": \"/path/to/local/file.txt\",\n    \"remote_path\": \"/remote/path/file.txt\"\n  }\n}\n```\n\n#### 22. ssh_download_file\n\u4ece\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0b\u8f7d\u6587\u4ef6\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `remote_path` (\u5fc5\u9700): \u8fdc\u7a0b\u6587\u4ef6\u8def\u5f84\n  - `local_path` (\u5fc5\u9700): \u672c\u5730\u6587\u4ef6\u8def\u5f84\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_download_file\",\n  \"arguments\": {\n    \"connection_id\": \"connection-uuid\",\n    \"remote_path\": \"/remote/path/file.txt\",\n    \"local_path\": \"/path/to/local/downloaded_file.txt\"\n  }\n}\n```\n\n#### 23. ssh_list_remote_directory\n\u5217\u51fa\u8fdc\u7a0b\u76ee\u5f55\u5185\u5bb9\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `remote_path` (\u53ef\u9009): \u8fdc\u7a0b\u76ee\u5f55\u8def\u5f84\uff0c\u9ed8\u8ba4\u4e3a\u5f53\u524d\u76ee\u5f55\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_list_remote_directory\",\n  \"arguments\": {\n    \"connection_id\": \"connection-uuid\",\n    \"remote_path\": \"/home/user/documents\"\n  }\n}\n```\n\n#### 24. ssh_create_remote_directory\n\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u521b\u5efa\u76ee\u5f55\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `remote_path` (\u5fc5\u9700): \u8981\u521b\u5efa\u7684\u8fdc\u7a0b\u76ee\u5f55\u8def\u5f84\n  - `mode` (\u53ef\u9009): \u76ee\u5f55\u6743\u9650\uff0c\u9ed8\u8ba4\u4e3a755\n  - `parents` (\u53ef\u9009): \u662f\u5426\u9012\u5f52\u521b\u5efa\u7236\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3atrue\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_create_remote_directory\",\n  \"arguments\": {\n    \"connection_id\": \"connection-uuid\",\n    \"remote_path\": \"/remote/new/directory\",\n    \"mode\": 755,\n    \"parents\": true\n  }\n}\n```\n\n#### 25. ssh_remove_remote_file\n\u5220\u9664\u8fdc\u7a0b\u6587\u4ef6\u6216\u76ee\u5f55\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `remote_path` (\u5fc5\u9700): \u8981\u5220\u9664\u7684\u8fdc\u7a0b\u6587\u4ef6\u6216\u76ee\u5f55\u8def\u5f84\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_remove_remote_file\",\n  \"arguments\": {\n    \"connection_id\": \"connection-uuid\",\n    \"remote_path\": \"/remote/path/to/delete\"\n  }\n}\n```\n\n#### 26. ssh_get_remote_file_info\n\u83b7\u53d6\u8fdc\u7a0b\u6587\u4ef6\u6216\u76ee\u5f55\u4fe1\u606f\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `remote_path` (\u5fc5\u9700): \u8fdc\u7a0b\u6587\u4ef6\u6216\u76ee\u5f55\u8def\u5f84\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_get_remote_file_info\",\n  \"arguments\": {\n    \"connection_id\": \"connection-uuid\",\n    \"remote_path\": \"/remote/path/file.txt\"\n  }\n}\n```\n\n#### 27. ssh_rename_remote_path\n\u91cd\u547d\u540d\u8fdc\u7a0b\u6587\u4ef6\u6216\u76ee\u5f55\n- **\u53c2\u6570**:\n  - `connection_id` (\u5fc5\u9700): SSH\u8fde\u63a5ID\n  - `old_path` (\u5fc5\u9700): \u539f\u59cb\u8def\u5f84\n  - `new_path` (\u5fc5\u9700): \u65b0\u8def\u5f84\n- **\u793a\u4f8b**:\n```json\n{\n  \"name\": \"ssh_rename_remote_path\",\n  \"arguments\": {\n    \"connection_id\": \"connection-uuid\",\n    \"old_path\": \"/remote/old_name.txt\",\n    \"new_path\": \"/remote/new_name.txt\"\n  }\n}\n```\n\n## \ud83d\udcd6 \u4f7f\u7528\u793a\u4f8b\n\n### \u542f\u52a8MCP\u670d\u52a1\n```bash\npython main.py\n```\n\n### \ud83c\udf1f \u65e0\u53c2\u6570\u542f\u52a8\u5de5\u4f5c\u6d41\u7a0b\uff08\u63a8\u8350\uff09\n\n**\u9002\u7528\u573a\u666f**\uff1a\u52a8\u6001\u8fde\u63a5\u7ba1\u7406\uff0c\u591a\u670d\u52a1\u5668\u64cd\u4f5c\uff0c\u5b89\u5168\u6027\u8981\u6c42\u9ad8\u7684\u73af\u5883\n\n1. **\u624b\u52a8\u5efa\u7acb\u8fde\u63a5**:\n```json\n{\n  \"name\": \"ssh_connect\",\n  \"arguments\": {\n    \"host\": \"192.168.1.100\",\n    \"username\": \"admin\",\n    \"password\": \"secure_password\"\n  }\n}\n```\n\n2. **\u67e5\u770b\u8fde\u63a5\u72b6\u6001**:\n```json\n{\n  \"name\": \"ssh_list_connections\",\n  \"arguments\": {}\n}\n```\n\n3. **\u6267\u884c\u547d\u4ee4**:\n```json\n{\n  \"name\": \"ssh_execute\",\n  \"arguments\": {\n    \"connection_id\": \"admin@192.168.1.100:22\",\n    \"command\": \"systemctl status nginx\"\n  }\n}\n```\n\n4. **\u8fde\u63a5\u5176\u4ed6\u670d\u52a1\u5668**:\n```json\n{\n  \"name\": \"ssh_connect\",\n  \"arguments\": {\n    \"host\": \"prod.example.com\",\n    \"username\": \"root\",\n    \"private_key\": \"/home/user/.ssh/id_rsa\"\n  }\n}\n```\n\n### \ud83c\udfaf \u914d\u7f6e\u6587\u4ef6\u5de5\u4f5c\u6d41\u7a0b\n\n**\u9002\u7528\u573a\u666f**\uff1a\u56fa\u5b9a\u670d\u52a1\u5668\u73af\u5883\uff0c\u6279\u91cf\u64cd\u4f5c\uff0c\u56e2\u961f\u534f\u4f5c\n\n1. **\u67e5\u770b\u914d\u7f6e\u7684\u8fde\u63a5**:\n```json\n{\n  \"name\": \"ssh_list_config\",\n  \"arguments\": {}\n}\n```\n\n2. **\u901a\u8fc7\u540d\u79f0\u5efa\u7acb\u8fde\u63a5**:\n```json\n{\n  \"name\": \"ssh_connect_by_name\",\n  \"arguments\": {\n    \"connection_name\": \"production-server\"\n  }\n}\n```\n\n3. **\u6267\u884c\u547d\u4ee4**:\n```json\n{\n  \"name\": \"ssh_execute\",\n  \"arguments\": {\n    \"connection_id\": \"admin@prod.example.com:22\",\n    \"command\": \"df -h\"\n  }\n}\n```\n\n4. **\u65ad\u5f00\u8fde\u63a5**:\n```json\n{\n  \"name\": \"ssh_disconnect\",\n  \"arguments\": {\n    \"connection_id\": \"admin@prod.example.com:22\"\n  }\n}\n```\n\n### \ud83c\udfe0 SSH Config\u5de5\u4f5c\u6d41\u7a0b \u2b50 \u65b0\u529f\u80fd\n\n**\u9002\u7528\u573a\u666f**\uff1a\u5df2\u6709SSH config\u914d\u7f6e\uff0c\u5229\u7528\u6807\u51c6SSH\u914d\u7f6e\u6587\u4ef6\n\n\u5047\u8bbe\u4f60\u7684 `~/.ssh/config` \u6587\u4ef6\u4e2d\u6709\u4ee5\u4e0b\u914d\u7f6e\uff1a\n\n```bash\nHost my-server\n    HostName 192.168.1.100\n    User admin\n    Port 22\n    IdentityFile ~/.ssh/id_rsa\n\nHost production\n    HostName prod.example.com\n    User root\n    Port 2222\n    IdentityFile ~/.ssh/prod_key\n```\n\n1. **\u4f7f\u7528SSH config\u4e3b\u673a\u540d\u5efa\u7acb\u8fde\u63a5**:\n```json\n{\n  \"name\": \"ssh_connect_by_config_host\",\n  \"arguments\": {\n    \"config_host\": \"my-server\"\n  }\n}\n```\n\n2. **\u8986\u76d6config\u4e2d\u7684\u7528\u6237\u540d**:\n```json\n{\n  \"name\": \"ssh_connect_by_config_host\",\n  \"arguments\": {\n    \"config_host\": \"production\",\n    \"username\": \"deploy\"\n  }\n}\n```\n\n3. **\u4f7f\u7528\u5bc6\u7801\u8986\u76d6config\u4e2d\u7684\u79c1\u94a5\u8ba4\u8bc1**:\n```json\n{\n  \"name\": \"ssh_connect_by_config_host\",\n  \"arguments\": {\n    \"config_host\": \"my-server\",\n    \"password\": \"temporary_password\"\n  }\n}\n```\n\n4. **\u67e5\u770b\u8fde\u63a5\u72b6\u6001**:\n```json\n{\n  \"name\": \"ssh_status\",\n  \"arguments\": {}\n}\n```\n\n5. **\u6267\u884c\u547d\u4ee4**:\n```json\n{\n  \"name\": \"ssh_execute\",\n  \"arguments\": {\n    \"connection_id\": \"my-server\",\n    \"command\": \"hostname\"\n  }\n}\n```\n\n**\u4f18\u52bf**\uff1a\n- \ud83c\udfaf **\u96f6\u914d\u7f6e**\uff1a\u76f4\u63a5\u4f7f\u7528\u5df2\u6709\u7684SSH config\u914d\u7f6e\n- \ud83d\udd17 **\u81ea\u52a8\u89e3\u6790**\uff1a\u81ea\u52a8\u5904\u7406\u4e3b\u673a\u540d\u3001\u7aef\u53e3\u3001\u7528\u6237\u540d\u3001\u79c1\u94a5\u7b49\n- \ud83d\udee1\ufe0f **\u5b89\u5168\u6027**\uff1a\u5229\u7528SSH config\u7684\u73b0\u6709\u5b89\u5168\u8bbe\u7f6e\n- \ud83d\udce6 **\u6807\u51c6\u5316**\uff1a\u9075\u5faaSSH\u6807\u51c6\u914d\u7f6e\u7ea6\u5b9a\n\n### \ud83d\ude80 \u81ea\u52a8\u8fde\u63a5\u5de5\u4f5c\u6d41\u7a0b\n\n1. **\u542f\u52a8\u65f6\u81ea\u52a8\u8fde\u63a5\u6240\u6709\u6807\u8bb0\u7684\u670d\u52a1\u5668**:\n```json\n{\n  \"name\": \"ssh_auto_connect\",\n  \"arguments\": {}\n}\n```\n\n2. **\u67e5\u770b\u6240\u6709\u8fde\u63a5\u72b6\u6001**:\n```json\n{\n  \"name\": \"ssh_status\",\n  \"arguments\": {}\n}\n```\n\n### \ud83d\udd04 \u5f02\u6b65\u547d\u4ee4\u5de5\u4f5c\u6d41\u7a0b\n\n1. **\u542f\u52a8\u957f\u65f6\u95f4\u8fd0\u884c\u547d\u4ee4**:\n```json\n{\n  \"name\": \"ssh_start_async_command\",\n  \"arguments\": {\n    \"connection_id\": \"admin@prod.example.com:22\",\n    \"command\": \"tail -f /var/log/nginx/access.log\"\n  }\n}\n```\n\n2. **\u67e5\u8be2\u547d\u4ee4\u72b6\u6001\u548c\u8f93\u51fa**:\n```json\n{\n  \"name\": \"ssh_get_command_status\",\n  \"arguments\": {\n    \"command_id\": \"\u8fd4\u56de\u7684\u547d\u4ee4UUID\"\n  }\n}\n```\n\n3. **\u7ec8\u6b62\u957f\u65f6\u95f4\u8fd0\u884c\u547d\u4ee4**:\n```json\n{\n  \"name\": \"ssh_terminate_command\",\n  \"arguments\": {\n    \"command_id\": \"\u8981\u7ec8\u6b62\u7684\u547d\u4ee4UUID\"\n  }\n}\n```\n\n### \ud83c\udfae \u4ea4\u4e92\u5f0f\u547d\u4ee4\u5de5\u4f5c\u6d41\u7a0b\n\n\u4ea4\u4e92\u5f0f\u547d\u4ee4\u652f\u6301\u8ba9\u5927\u6a21\u578b\u80fd\u591f\u4e0e\u9700\u8981\u7528\u6237\u8f93\u5165\u7684\u547d\u4ee4\u8fdb\u884c\u5b9e\u65f6\u4ea4\u4e92\uff0c\u5982 `sudo`\u3001`vim`\u3001`mysql`\u3001`python` \u7b49\u3002\n\n#### \u57fa\u672c\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\n\n1. **\u542f\u52a8\u4ea4\u4e92\u5f0f\u4f1a\u8bdd**:\n```json\n{\n  \"name\": \"ssh_start_interactive\",\n  \"arguments\": {\n    \"connection_id\": \"admin@prod.example.com:22\",\n    \"command\": \"bash\",\n    \"pty_width\": 80,\n    \"pty_height\": 24\n  }\n}\n```\n\n2. **\u53d1\u9001\u547d\u4ee4\u5230\u4f1a\u8bdd**:\n```json\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"\u8fd4\u56de\u7684\u4f1a\u8bddUUID\",\n    \"input_text\": \"ls -la\\n\"\n  }\n}\n```\n\n3. **\u83b7\u53d6\u4f1a\u8bdd\u8f93\u51fa**:\n```json\n{\n  \"name\": \"ssh_get_interactive_output\",\n  \"arguments\": {\n    \"session_id\": \"\u4f1a\u8bddUUID\",\n    \"max_lines\": 50\n  }\n}\n```\n\n4. **\u7ec8\u6b62\u4ea4\u4e92\u5f0f\u4f1a\u8bdd**:\n```json\n{\n  \"name\": \"ssh_terminate_interactive\",\n  \"arguments\": {\n    \"session_id\": \"\u4f1a\u8bddUUID\"\n  }\n}\n```\n\n#### \u9ad8\u7ea7\u4ea4\u4e92\u5f0f\u573a\u666f\n\n**1. sudo \u547d\u4ee4\u4ea4\u4e92**:\n```json\n// \u542f\u52a8\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\n{\n  \"name\": \"ssh_start_interactive\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"command\": \"sudo -i\"\n  }\n}\n\n// \u53d1\u9001\u5bc6\u7801\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"your_password\\n\"\n  }\n}\n\n// \u6267\u884c\u7ba1\u7406\u5458\u547d\u4ee4\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"systemctl status nginx\\n\"\n  }\n}\n```\n\n**2. Python \u4ea4\u4e92\u5f0f\u73af\u5883**:\n```json\n// \u542f\u52a8Python\u89e3\u91ca\u5668\n{\n  \"name\": \"ssh_start_interactive\",\n  \"arguments\": {\n    \"connection_id\": \"dev@server:22\",\n    \"command\": \"python3\"\n  }\n}\n\n// \u6267\u884cPython\u4ee3\u7801\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"import os\\nprint(os.getcwd())\\n\"\n  }\n}\n```\n\n**3. \u6587\u672c\u7f16\u8f91\u5668 (vim/nano)**:\n```json\n// \u542f\u52a8vim\u7f16\u8f91\u5668\n{\n  \"name\": \"ssh_start_interactive\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"command\": \"vim /etc/hosts\",\n    \"pty_width\": 120,\n    \"pty_height\": 30\n  }\n}\n\n// \u8fdb\u5165\u63d2\u5165\u6a21\u5f0f\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"i\"\n  }\n}\n\n// \u8f93\u5165\u5185\u5bb9\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"127.0.0.1 localhost\\n\"\n  }\n}\n\n// \u4fdd\u5b58\u5e76\u9000\u51fa\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"\\u001b:wq\\n\"\n  }\n}\n```\n\n**4. \u6570\u636e\u5e93\u4ea4\u4e92 (MySQL)**:\n```json\n// \u8fde\u63a5MySQL\n{\n  \"name\": \"ssh_start_interactive\",\n  \"arguments\": {\n    \"connection_id\": \"db@server:22\",\n    \"command\": \"mysql -u root -p\"\n  }\n}\n\n// \u8f93\u5165\u5bc6\u7801\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"database_password\\n\"\n  }\n}\n\n// \u6267\u884cSQL\u67e5\u8be2\n{\n  \"name\": \"ssh_send_input\",\n  \"arguments\": {\n    \"session_id\": \"session_uuid\",\n    \"input_text\": \"SHOW DATABASES;\\n\"\n  }\n}\n```\n\n#### \u4ea4\u4e92\u5f0f\u4f1a\u8bdd\u7ba1\u7406\n\n**\u67e5\u770b\u6240\u6709\u6d3b\u8dc3\u4f1a\u8bdd**:\n```json\n{\n  \"name\": \"ssh_list_interactive_sessions\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\"\n  }\n}\n```\n\n#### \u4ea4\u4e92\u5f0f\u547d\u4ee4\u6700\u4f73\u5b9e\u8df5\n\n1. **PTY \u5c3a\u5bf8\u8bbe\u7f6e**:\n   - \u5bf9\u4e8e\u6587\u672c\u7f16\u8f91\u5668\uff0c\u5efa\u8bae\u4f7f\u7528\u8f83\u5927\u7684\u7ec8\u7aef\u5c3a\u5bf8 (120x30)\n   - \u5bf9\u4e8e\u7b80\u5355\u547d\u4ee4\u4ea4\u4e92\uff0c\u9ed8\u8ba4\u5c3a\u5bf8 (80x24) \u5373\u53ef\n\n2. **\u8f93\u5165\u683c\u5f0f**:\n   - \u547d\u4ee4\u7ed3\u5c3e\u6dfb\u52a0 `\\n` \u8868\u793a\u56de\u8f66\n   - \u7279\u6b8a\u952e\u4f7f\u7528\u8f6c\u4e49\u5e8f\u5217\uff0c\u5982 ESC \u952e: `\\u001b`\n   - Ctrl+C: `\\u0003`, Ctrl+D: `\\u0004`\n\n3. **\u8f93\u51fa\u7f13\u51b2**:\n   - \u5b9a\u671f\u83b7\u53d6\u8f93\u51fa\u907f\u514d\u7f13\u51b2\u533a\u6ea2\u51fa\n   - \u4f7f\u7528 `max_lines` \u53c2\u6570\u63a7\u5236\u8f93\u51fa\u91cf\n   - \u5bf9\u4e8e\u5927\u91cf\u8f93\u51fa\uff0c\u5206\u6279\u83b7\u53d6\n\n4. **\u4f1a\u8bdd\u6e05\u7406**:\n   - \u53ca\u65f6\u7ec8\u6b62\u4e0d\u9700\u8981\u7684\u4f1a\u8bdd\n   - \u907f\u514d\u957f\u65f6\u95f4\u4fdd\u6301\u7a7a\u95f2\u4f1a\u8bdd\n   - \u8fde\u63a5\u65ad\u5f00\u65f6\u4f1a\u81ea\u52a8\u6e05\u7406\u76f8\u5173\u4f1a\u8bdd\n\n5. **\u9519\u8bef\u5904\u7406**:\n   - \u68c0\u67e5\u4f1a\u8bdd\u72b6\u6001\uff0c\u5904\u7406\u4f1a\u8bdd\u5f02\u5e38\u7ec8\u6b62\n   - \u5bf9\u4e8e\u9700\u8981\u5bc6\u7801\u7684\u547d\u4ee4\uff0c\u51c6\u5907\u597d\u51ed\u636e\n   - \u5904\u7406\u547d\u4ee4\u6267\u884c\u8d85\u65f6\u60c5\u51b5\n\n### \ud83c\udff7\ufe0f \u6807\u7b7e\u8fc7\u6ee4\u793a\u4f8b\n\n1. **\u67e5\u770b\u6240\u6709\u751f\u4ea7\u73af\u5883\u8fde\u63a5**:\n```json\n{\n  \"name\": \"ssh_list_config\",\n  \"arguments\": {\n    \"filter_tag\": \"production\"\n  }\n}\n```\n\n2. **\u67e5\u770b\u6240\u6709\u5f00\u53d1\u73af\u5883\u8fde\u63a5**:\n```json\n{\n  \"name\": \"ssh_list_config\",\n  \"arguments\": {\n    \"filter_tag\": \"development\"\n  }\n}\n```\n\n## \ud83d\udd17 \u8fde\u63a5ID\u683c\u5f0f\n\n\u8fde\u63a5ID\u683c\u5f0f\u4e3a: `username@host:port`\n\u4f8b\u5982: `admin@prod.example.com:22`\n\n## \ud83d\udce6 \u6253\u5305\u548c\u5206\u53d1\n\n### \u521b\u5efa\u5206\u53d1\u5305\n\n```bash\n# \u6784\u5efa\u6240\u6709\u5305\u683c\u5f0f\npython build.py --all\n\n# \u4ec5\u6784\u5efawheel\u5305\npython build.py --wheel\n\n# \u4ec5\u521b\u5efa\u4fbf\u643a\u5f0f\u5305\npython build.py --portable\n```\n\n### \u4fbf\u643a\u5f0f\u5305\u4f7f\u7528\n\n1. \u4e0b\u8f7d `ssh-agent-mcp-portable.zip`\n2. \u89e3\u538b\u5230\u76ee\u6807\u76ee\u5f55\n3. \u5b89\u88c5\u4f9d\u8d56: `pip install -r requirements.txt`\n4. \u914d\u7f6eSSH\u8fde\u63a5: \u590d\u5236\u5e76\u7f16\u8f91 `ssh_config.json`\n5. \u542f\u52a8\u670d\u52a1: `python start_ssh_agent.py`\n\n## \u5b89\u5168\u6ce8\u610f\u4e8b\u9879\n\n- \u8bf7\u786e\u4fddSSH\u51ed\u636e\u7684\u5b89\u5168\uff0c\u907f\u514d\u5728\u65e5\u5fd7\u4e2d\u66b4\u9732\u654f\u611f\u4fe1\u606f\n- \u5efa\u8bae\u4f7f\u7528\u79c1\u94a5\u8ba4\u8bc1\u800c\u975e\u5bc6\u7801\u8ba4\u8bc1\n- \u5728\u751f\u4ea7\u73af\u5883\u4e2d\u8003\u8651\u4f7f\u7528SSH\u4ee3\u7406\u8f6c\u53d1\n- \u5b9a\u671f\u8f6e\u6362SSH\u5bc6\u94a5\u548c\u5bc6\u7801\n\n## \u9519\u8bef\u5904\u7406\n\n\u670d\u52a1\u5305\u542b\u5b8c\u5584\u7684\u9519\u8bef\u5904\u7406\u673a\u5236\uff1a\n- \u8fde\u63a5\u5931\u8d25\u65f6\u4f1a\u8fd4\u56de\u8be6\u7ec6\u7684\u9519\u8bef\u4fe1\u606f\n- \u547d\u4ee4\u6267\u884c\u5931\u8d25\u65f6\u4f1a\u8fd4\u56de\u9000\u51fa\u7801\u548c\u9519\u8bef\u8f93\u51fa\n- \u652f\u6301\u8fde\u63a5\u8d85\u65f6\u548c\u547d\u4ee4\u6267\u884c\u8d85\u65f6\n\n## \u6d4b\u8bd5\n\n\u8fd0\u884c\u6d4b\u8bd5\u811a\u672c\u9a8c\u8bc1\u529f\u80fd\uff1a\n\n### \u57fa\u7840\u529f\u80fd\u6d4b\u8bd5\n```bash\npython simple_test.py\n```\n\n### MCP\u534f\u8bae\u6d4b\u8bd5\n```bash\npython test_mcp.py\n```\n\n### \u4ea4\u4e92\u5f0f\u547d\u4ee4\u6d4b\u8bd5\n```bash\n# \u6d4b\u8bd5SSH Manager\u7684\u4ea4\u4e92\u5f0f\u529f\u80fd\npython test_interactive.py\n\n# \u6d4b\u8bd5MCP\u4ea4\u4e92\u5f0f\u5de5\u5177\npython test_mcp_interactive.py\n```\n\n## \ud83d\udcc1 \u9879\u76ee\u7ed3\u6784\n\n```\nsshagent/\n\u251c\u2500\u2500 main.py              # \u4e3b\u5165\u53e3\u6587\u4ef6\n\u251c\u2500\u2500 mcp_server.py        # MCP\u670d\u52a1\u5668\u5b9e\u73b0\n\u251c\u2500\u2500 ssh_manager.py       # SSH\u8fde\u63a5\u7ba1\u7406\u5668\n\u251c\u2500\u2500 config_loader.py     # \u914d\u7f6e\u6587\u4ef6\u52a0\u8f7d\u5668\n\u251c\u2500\u2500 install.py           # \u5b89\u88c5\u811a\u672c\n\u251c\u2500\u2500 build.py             # \u6253\u5305\u811a\u672c\n\u251c\u2500\u2500 pyproject.toml       # \u9879\u76ee\u914d\u7f6e\n\u251c\u2500\u2500 README.md            # \u8bf4\u660e\u6587\u6863\n\u251c\u2500\u2500 simple_test.py       # \u7b80\u5355\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 test_mcp.py          # MCP\u534f\u8bae\u6d4b\u8bd5\n\u251c\u2500\u2500 test_interactive.py  # \u4ea4\u4e92\u5f0f\u547d\u4ee4\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 test_mcp_interactive.py # MCP\u4ea4\u4e92\u5f0f\u5de5\u5177\u6d4b\u8bd5\n\u2514\u2500\u2500 ssh_config.json      # SSH\u8fde\u63a5\u914d\u7f6e\u6587\u4ef6\uff08\u7528\u6237\u521b\u5efa\uff09\n```\n\n## \ud83d\udcda \u4f9d\u8d56\u9879\n\n- `mcp`: Model Context Protocol\u5b9e\u73b0\n- `paramiko`: SSH\u5ba2\u6237\u7aef\u5e93\n- `pydantic`: \u6570\u636e\u9a8c\u8bc1\u548c\u5e8f\u5217\u5316\n- `asyncio`: \u5f02\u6b65IO\u652f\u6301\n\n## \ud83d\udd27 Claude Desktop\u914d\u7f6e\n\n### \u914d\u7f6e\u6587\u4ef6\u4f4d\u7f6e\n\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows**: `%APPDATA%/Claude/claude_desktop_config.json`\n- **Linux**: `~/.config/claude-desktop/claude_desktop_config.json`\n\n### \u57fa\u672c\u914d\u7f6e\u793a\u4f8b\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--host=192.168.1.100\",\n        \"--user=root\",\n        \"--password=your_password\"\n      ]\n    }\n  }\n}\n```\n\n### \u591a\u670d\u52a1\u5668\u914d\u7f6e\n\n```json\n{\n  \"mcpServers\": {\n    \"ssh-prod\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--config=/path/to/prod_config.json\",\n        \"--connection=prod-server\",\n        \"--auto-connect\"\n      ]\n    },\n    \"ssh-dev\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"ssh-agent-mcp@latest\",\n        \"--host=192.168.1.200\",\n        \"--user=dev\",\n        \"--password=dev_password\"\n      ]\n    }\n  }\n}\n```\n\n### \u914d\u7f6e\u8bf4\u660e\n\n- `uvx`: Python\u5305\u8fd0\u884c\u5668\uff0c\u4f1a\u81ea\u52a8\u4e0b\u8f7d\u5e76\u8fd0\u884c\u6307\u5b9a\u7248\u672c\u7684\u5305\n- `ssh-agent-mcp@latest`: \u4f7f\u7528\u6700\u65b0\u7248\u672c\uff0c\u4e5f\u53ef\u4ee5\u6307\u5b9a\u5177\u4f53\u7248\u672c\u5982 `@0.1.0`\n- \u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u8986\u76d6\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u76f8\u5e94\u8bbe\u7f6e\n- \u4f7f\u7528 `--auto-connect` \u53ef\u4ee5\u5728\u542f\u52a8\u65f6\u81ea\u52a8\u5efa\u7acbSSH\u8fde\u63a5\n\n### \u66f4\u591a\u914d\u7f6e\u793a\u4f8b\n\n\u67e5\u770b `claude_desktop_config_examples.json` \u6587\u4ef6\u83b7\u53d6\u66f4\u591a\u914d\u7f6e\u793a\u4f8b\u3002\n\n### \ud83d\udcc1 SFTP\u6587\u4ef6\u4f20\u8f93\u793a\u4f8b\n\n**1. \u4e0a\u4f20\u6587\u4ef6\u5230\u8fdc\u7a0b\u670d\u52a1\u5668**:\n```json\n{\n  \"name\": \"ssh_upload_file\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"local_path\": \"/home/user/documents/report.pdf\",\n    \"remote_path\": \"/remote/uploads/report.pdf\"\n  }\n}\n```\n\n**2. \u4ece\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0b\u8f7d\u6587\u4ef6**:\n```json\n{\n  \"name\": \"ssh_download_file\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"remote_path\": \"/remote/data/backup.zip\",\n    \"local_path\": \"/home/user/downloads/backup.zip\"\n  }\n}\n```\n\n**3. \u6d4f\u89c8\u8fdc\u7a0b\u76ee\u5f55**:\n```json\n{\n  \"name\": \"ssh_list_remote_directory\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"remote_path\": \"/home/user/documents\"\n  }\n}\n```\n\n**4. \u521b\u5efa\u8fdc\u7a0b\u76ee\u5f55**:\n```json\n{\n  \"name\": \"ssh_create_remote_directory\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"remote_path\": \"/remote/new/project\",\n    \"mode\": 755,\n    \"parents\": true\n  }\n}\n```\n\n**5. \u6279\u91cf\u6587\u4ef6\u64cd\u4f5c\u5de5\u4f5c\u6d41**:\n```json\n// 1. \u521b\u5efa\u8fdc\u7a0b\u76ee\u5f55\n{\n  \"name\": \"ssh_create_remote_directory\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"remote_path\": \"/remote/backup/2024-01-15\"\n  }\n}\n\n// 2. \u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6\n{\n  \"name\": \"ssh_upload_file\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"local_path\": \"/home/user/data/file1.txt\",\n    \"remote_path\": \"/remote/backup/2024-01-15/file1.txt\"\n  }\n}\n\n// 3. \u5217\u51fa\u4e0a\u4f20\u7684\u6587\u4ef6\n{\n  \"name\": \"ssh_list_remote_directory\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"remote_path\": \"/remote/backup/2024-01-15\"\n  }\n}\n```\n\n**6. \u8fdc\u7a0b\u6587\u4ef6\u7ba1\u7406**:\n```json\n// \u83b7\u53d6\u6587\u4ef6\u4fe1\u606f\n{\n  \"name\": \"ssh_get_remote_file_info\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"remote_path\": \"/remote/logs/app.log\"\n  }\n}\n\n// \u91cd\u547d\u540d\u6587\u4ef6\n{\n  \"name\": \"ssh_rename_remote_path\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"old_path\": \"/remote/logs/app.log\",\n    \"new_path\": \"/remote/logs/app_backup.log\"\n  }\n}\n\n// \u5220\u9664\u65e7\u6587\u4ef6\n{\n  \"name\": \"ssh_remove_remote_file\",\n  \"arguments\": {\n    \"connection_id\": \"user@server:22\",\n    \"remote_path\": \"/remote/logs/old_app.log\"\n  }\n}\n```\n\n## \ud83d\udea8 \u5b89\u5168\u6ce8\u610f\u4e8b\u9879\n\n- \ud83d\udd10 \u8bf7\u786e\u4fddSSH\u51ed\u636e\u7684\u5b89\u5168\uff0c\u907f\u514d\u5728\u65e5\u5fd7\u4e2d\u66b4\u9732\u654f\u611f\u4fe1\u606f\n- \ud83d\udd11 \u5efa\u8bae\u4f7f\u7528\u79c1\u94a5\u8ba4\u8bc1\u800c\u975e\u5bc6\u7801\u8ba4\u8bc1\n- \ud83d\udee1\ufe0f \u5728\u751f\u4ea7\u73af\u5883\u4e2d\u8003\u8651\u4f7f\u7528SSH\u4ee3\u7406\u8f6c\u53d1\n- \ud83d\udd04 \u5b9a\u671f\u8f6e\u6362SSH\u5bc6\u94a5\u548c\u5bc6\u7801\n- \ud83d\udcdd \u4e0d\u8981\u5c06\u5305\u542b\u5bc6\u7801\u7684\u914d\u7f6e\u6587\u4ef6\u63d0\u4ea4\u5230\u7248\u672c\u63a7\u5236\u7cfb\u7edf\n\n## \ud83d\udc1b \u6545\u969c\u6392\u9664\n\n### \u5e38\u89c1\u95ee\u9898\n\n1. **\u8fde\u63a5\u5931\u8d25**\n   - \u68c0\u67e5SSH\u670d\u52a1\u5668\u5730\u5740\u548c\u7aef\u53e3\n   - \u9a8c\u8bc1\u7528\u6237\u540d\u548c\u5bc6\u7801/\u79c1\u94a5\n   - \u786e\u8ba4SSH\u670d\u52a1\u6b63\u5728\u8fd0\u884c\n\n2. **\u79c1\u94a5\u8ba4\u8bc1\u5931\u8d25**\n   - \u68c0\u67e5\u79c1\u94a5\u6587\u4ef6\u8def\u5f84\n   - \u786e\u8ba4\u79c1\u94a5\u6743\u9650\u6b63\u786e\uff08600\uff09\n   - \u5982\u679c\u79c1\u94a5\u6709\u5bc6\u7801\uff0c\u8bf7\u63d0\u4f9bprivate_key_password\n\n3. **\u914d\u7f6e\u6587\u4ef6\u9519\u8bef**\n   - \u9a8c\u8bc1JSON\u683c\u5f0f\u662f\u5426\u6b63\u786e\n   - \u68c0\u67e5\u5fc5\u9700\u5b57\u6bb5\u662f\u5426\u586b\u5199\n   - \u67e5\u770b\u65e5\u5fd7\u83b7\u53d6\u8be6\u7ec6\u9519\u8bef\u4fe1\u606f\n\n4. **MCP\u670d\u52a1\u5668\u65e0\u6cd5\u542f\u52a8**\n   - \u68c0\u67e5Python\u73af\u5883\u548c\u4f9d\u8d56\n   - \u786e\u8ba4\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u6b63\u786e\n   - \u67e5\u770b\u9519\u8bef\u65e5\u5fd7\n\n### \u8c03\u8bd5\u6a21\u5f0f\n\n\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\u542f\u7528\u8c03\u8bd5\u65e5\u5fd7\uff1a\n```bash\nexport SSH_LOG_LEVEL=DEBUG\npython main.py\n```\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\nMIT License\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "SSH Agent MCP\u670d\u52a1 - \u652f\u6301SSH\u8fde\u63a5\u7ba1\u7406\u3001\u547d\u4ee4\u6267\u884c\u548cSFTP\u6587\u4ef6\u4f20\u8f93\u7684\u5b8c\u6574MCP\u670d\u52a1\u5668",
    "version": "0.3.2",
    "project_urls": {
        "Bug Tracker": "https://github.com/zhijun/ssh-mcp/issues",
        "Documentation": "https://github.com/zhijun/ssh-mcp#readme",
        "Homepage": "https://github.com/zhijun/ssh-mcp",
        "Repository": "https://github.com/zhijun/ssh-mcp"
    },
    "split_keywords": [
        "mcp",
        " ssh",
        " remote",
        " automation",
        " claude",
        " sftp",
        " file-transfer"
    ],
    "urls": [
        {
            "comment_text": "https.proxy=http://localhost:1984",
            "digests": {
                "blake2b_256": "3b8b33b82991f1f646c7d1f26f2307c5104c26057d79c6feb8c8a4db84a3c6dd",
                "md5": "51ca572741bbb2043fd23a067e9a3311",
                "sha256": "3063d76c25193c4c011dde3e00c530580484adf692f8527de50b10153f962557"
            },
            "downloads": -1,
            "filename": "ssh_agent_mcp-0.3.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "51ca572741bbb2043fd23a067e9a3311",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.12",
            "size": 32881,
            "upload_time": "2025-10-26T02:16:45",
            "upload_time_iso_8601": "2025-10-26T02:16:45.517847Z",
            "url": "https://files.pythonhosted.org/packages/3b/8b/33b82991f1f646c7d1f26f2307c5104c26057d79c6feb8c8a4db84a3c6dd/ssh_agent_mcp-0.3.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "https.proxy=http://localhost:1984",
            "digests": {
                "blake2b_256": "109fbb890f6679e58a98084937a197a6b5290baffe7e6045139ef5829cd1d349",
                "md5": "7ddf9d9074934a68f16f16f57cd374fc",
                "sha256": "8783d7ba2066a8e513d7fa45b6f2d86212182d3f095685ab7b788927a5b047a2"
            },
            "downloads": -1,
            "filename": "ssh_agent_mcp-0.3.2.tar.gz",
            "has_sig": false,
            "md5_digest": "7ddf9d9074934a68f16f16f57cd374fc",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.12",
            "size": 39022,
            "upload_time": "2025-10-26T02:16:46",
            "upload_time_iso_8601": "2025-10-26T02:16:46.761388Z",
            "url": "https://files.pythonhosted.org/packages/10/9f/bb890f6679e58a98084937a197a6b5290baffe7e6045139ef5829cd1d349/ssh_agent_mcp-0.3.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-26 02:16:46",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "zhijun",
    "github_project": "ssh-mcp",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "ssh-agent-mcp"
}