持久化的终端会话 + 文件传输功能,适用于AI助手
通过AI助手进行SSH连接到服务器,执行命令,传输文件——所有操作都无需担心状态问题。
</div>像Cursor这样的AI助手执行命令是无状态的——每个命令都在一个全新的环境中运行:
❌ ssh user@server # 挂起,没有输出直到退出
❌ 无法在SSH后运行命令
❌ 每个命令从头开始
❌ 无法传输文件到/从服务器
❌ 每次操作都需要重新认证
ShellKeeper将AI助手转变为具有持久会话和文件传输能力的状态化操作者。
传统AI(无状态)
您: "SSH到服务器"
AI: ❌ 命令挂起
您: "列出文件"
AI: ❌ 在本地运行,不在服务器上
ShellKeeper(有状态)
您: "连接到我的服务器"
AI: ✅ 建立SSH会话
您: "有哪些文件?"
AI: ✅ 列出服务器上的文件
您: "进入日志文件夹"
AI: ✅ 更改到/var/log
您: "显示最近的错误"
AI: ✅ 显示日志内容
AI在整个对话中保持上下文!
</td> <td width="33%" align="left">自然对话流程
您: "SSH到生产服务器"
AI: ✅ 连接到prod-01
会话:prod-01
您: "剩余多少磁盘空间?"
AI: ✅ 剩余45GB
(同一会话,无需重新认证)
您: "显示今天的日志"
AI: ✅ 显示日志...
(同一会话继续)
您: "重启API服务"
AI: ✅ 服务已重启
(仍然是同一会话!)
AI记住一切:
只需用自然语言请求
您: "上传我的配置到服务器"
AI: ✅ 已上传config.json
/app/config/config.json
---
您: "下载错误日志"
AI: ✅ 已下载app.log
保存到./logs/app.log
---
您: "获取数据库备份"
AI: ✅ 已下载backup.sql
(即使通过SSH跳转!)
它就这么简单:
观看如何将自然对话变成自动化操作:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
👤 您提问:
"调试prod-server-01上的慢API"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🤖 AI执行:
[连接...]
→ ssh user@prod-server-01
✅ 连接到prod-server-01
[调查进程...]
→ ps aux | grep api
📊 发现API进程:PID 1234,使用98% CPU
[检查日志...]
→ cd /var/log/api && tail -n 1100 error.log
🔍 错误:内存泄漏在/api/v1/users端点
[下载以分析...]
→ 下载:/var/log/api/error.log → ./local-debug/
✅ 已下载2.4MB(分析:500+内存分配错误)
[应用修复...]
→ 上传:./fixed-config.yml → /app/config/
✅ 已上传新的限流配置
[重启服务...]
→ systemctl restart api-service
→ systemctl status api-service
✅ 服务已重启,CPU降至12%
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🤖 AI回复:
"已修复!API在用户端点存在内存泄漏。
• 下载日志并发现500+内存分配错误
• 应用限流配置
• 重启服务 - CPU从98%降至12%
• 所有操作在一个持久会话中完成"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ 全部在一个会话中完成,无需重新认证! ✨
npm install -g mcp-shellkeeper
Cursor
设置JSON:
{
"mcpServers": {
"shellkeeper": {
"command": "npx",
"args": ["-y", "mcp-shellkeeper"]
}
}
}
(Cmd+Shift+P → Preferences: Open Settings)
Claude Code
配置文件:
{
"mcpServers": {
"shellkeeper": {
"command": "npx",
"args": ["-y", "mcp-shellkeeper"]
}
}
}
(~/.config/claude/config.json)
VS Code (Cline)
设置JSON:
{
"cline.mcpServers": {
"shellkeeper": {
"command": "npx",
"args": ["-y", "mcp-shellkeeper"]
}
}
}
</td>
</tr>
</table>
重启您的AI助手,即可准备就绪! 🎉
| 场景 | 您提问 | AI做什么 |
|---|---|---|
| 🔍 调试生产环境 | "为什么prod-api慢?" | SSH → 检查CPU/内存 → 下载日志 → 分析 → 上传修复 → 重启 |
| 🚀 部署更新 | "部署v2.0到测试环境" | SSH → 备份 → 上传文件 → 数据库迁移 → 重启 → 验证 |
| 🔧 更新配置 | "更新web服务器上的SSL证书" | SSH → 下载旧证书 → 上传新证书 → 测试 → 重新加载nginx |
| 🗄️ 备份数据库 | "将生产数据库备份到本地" | 通过堡垒机SSH → 导出数据库 → 压缩 → 下载 → 验证 |
| 📊 分析日志 | "查找今天的所有500错误" | SSH → 解析日志 → 下载 → 本地分析 → 报告模式 |
| 🔄 批量操作 | "更新所有服务器上的配置" | 并行会话 → 上传 → 重启 → 下载结果 |
全部通过与您的AI助手的自然对话完成! 不需要脚本,不需要手动SSH切换。
AI自动使用这些工具,但您可以参考它们用于高级用途:
| 工具 | 目的 | 关键特性 |
|---|---|---|
terminal_execute | 在持久会话中运行命令 | 超时配置,捕获退出码,干净输出 |
terminal_upload_file | 上传本地 → 远程(最大10MB) | 自动检测目录,处理重复项,通过SSH工作 |
terminal_download_file | 下载远程 → 本地(最大10MB) | 自动创建目录,保留权限,验证完整性 |
terminal_new_session | 创建隔离会话 | 并行操作,独立环境 |
terminal_list_sessions | 查看所有活动会话 | 状态,运行时间,最后一条命令 |
terminal_close_session | 清理会话 | 完成任务后释放资源 |
terminal_get_buffer | 调试原始输出 | 用于故障排除 |
💡 提示: AI根据您的自然语言请求自动处理这些工具!
✅ 应该做:
ssh-keygen -t ed25519ssh -J bastion.com user@prod/etc,/root,.ssh/)❌ 不应该做:
持久会话:
文件传输:
// 增加长时间运行命令的超时时间
terminal_execute({
command: "npm install",
timeout: 120000 // 2分钟
})
// 检查SSH密钥是否正确设置
ssh -v user@server
</details>
<details>
<summary><b>SSH请求密码</b></summary>
# 设置无密码认证
ssh-keygen -t ed25519
ssh-copy-id user@server
# 验证
ssh user@server "echo 成功"
</details>
<details>
<summary><b>文件上传失败</b></summary>
// 首先检查是否在SSH会话中
terminal_execute({ command: "pwd" }) // 验证您在远程服务器上
// 确保远程目录存在
terminal_execute({ command: "mkdir -p /app/uploads" })
// 然后上传
terminal_upload({ local_path: "file.txt", remote_path: "/app/uploads/file.txt" })
</details>
<details>
<summary><b>文件下载失败</b></summary>
// 验证远程文件是否存在
terminal_execute({ command: "ls -lh /path/to/file" })
// 检查权限
terminal_execute({ command: "cat /path/to/file | wc -l" })
// 尝试使用绝对路径下载
terminal_download({ remote_path: "/full/path/to/file", local_path: "./" })
</details>
<details>
<summary><b>会话变得无响应</b></summary>
// 列出所有会话
terminal_list_sessions()
// 关闭有问题的会话
terminal_close_session({ session_id: "stuck-session" })
// 创建新的会话
terminal_new_session({ session_id: "new-session" })
</details>
# 克隆仓库
git clone https://github.com/tranhuucanh/mcp-shellkeeper.git
cd mcp-shellkeeper
# 安装依赖
npm install
# 构建
npm run build
# 使用stdio传输进行本地测试
node dist/index.js
# 使用MCP Inspector进行测试
npm run inspector
欢迎贡献!帮助改进AI辅助的服务器管理。
git checkout -b feature/amazing-feature)git commit -m '添加神奇功能')git push origin feature/amazing-feature)MIT许可证 - 详情见LICENSE文件。
您可以:
为AI开发者社区打造,充满爱心
状态化执行 + 文件传输 = 无限可能
</div>