用 Tauri 2 + Rust 开发 AI 驱动的 SSH 管理工具

34 阅读5分钟

支持 MCP 协议,让 Claude 直接操作服务器

cover.png

一、项目背景

1.1 痛点分析

作为一名开发者/运维,你是否遇到过这些问题:

  • 管理多台服务器,IP 和密码记不住
  • 常用命令总是忘记,每次都要查
  • 日志文件太大,肉眼分析效率低
  • 重复性操作多,浪费时间

1.2 竞品分析

comparison.png

从对比可以看出,现有工具要么收费昂贵,要么功能单一,更重要的是没有 AI 能力

1.3 为什么选择 MCP?

MCP(Model Context Protocol)是 Anthropic 推出的协议,让 AI 助手能够安全地操作外部工具。

通过 MCP,Claude 可以:

  • 直接连接你的 SSH 服务器
  • 执行命令并分析结果
  • 管理文件和目录
  • 监控系统状态

二、技术选型

2.1 为什么选 Tauri 2?

对比项ElectronTauri 2
安装包大小100MB+10-20MB
内存占用200MB+50-100MB
启动速度
后端语言Node.jsRust
安全性一般

2.2 为什么选 Rust + russh?

  • 原生 async/await:不需要用线程模拟
  • 性能优秀:零成本抽象
  • 安全可靠:内存安全保证

2.3 为什么选 React 19?

  • 最新特性支持
  • 生态成熟
  • Ant Design 6 完美适配

2.4 技术架构

architecture.png

整体采用三层架构:

  • 前端层:React + xterm.js,负责 UI 和终端渲染
  • 桥接层:Tauri IPC,实现前后端通信
  • 后端层:Rust + russh,处理 SSH 连接和文件传输

三、核心功能实现

3.1 SSH 连接管理

使用 russh 的 async API 实现非阻塞连接:

use russh::*;

async fn connect_ssh(host: &str, port: u16, username: &str, password: &str) 
    -> Result<Handle, Error> {
    let config = russh::client::Config::default();
    let mut session = russh::client::connect(
        config,
        (host, port),
        Client {},
    ).await?;
    
    session.authenticate_password(username, password).await?;
    Ok(session)
}

关键设计

  • 使用 tokio::RwLock 管理全局会话
  • 每个连接独立 channel,互不阻塞
  • 支持断线重连

ssh-flow.png

3.2 终端实现

使用 xterm.js + Tauri Events 实现实时终端:

// 前端监听 shell 输出
import { listen } from '@tauri-apps/api/event';

const unlisten = await listen(`shell-output-${shellId}`, (event) => {
  terminal.write(event.payload as Uint8Array);
});

// 用户输入发送到后端
terminal.onData((data) => {
  invoke('write_shell', { id: shellId, data });
});

关键设计

  • 后端 tokio::spawn 独立任务读取输出
  • 通过 Tauri Events 实时推送
  • 支持 resize 同步

terminal.png

功能亮点

  • 多标签管理,可拖拽排序
  • 悬浮工具栏(复制、搜索、全屏、监控)
  • 右键菜单(复制、粘贴、全选、查找)
  • 终端搜索(Ctrl+F)

3.3 SFTP 文件传输

使用 russh-sftp 实现后台传输:

async fn upload_file(
    sftp: &SftpSession,
    local_path: PathBuf,
    remote_path: String,
    app: AppHandle,
) -> Result<(), Error> {
    let mut file = File::open(&local_path).await?;
    let mut remote = sftp.create(Path::new(&remote_path)).await?;
    
    let mut buffer = vec![0u8; 64 * 1024]; // 64KB 缓冲
    loop {
        let n = file.read(&mut buffer).await?;
        if n == 0 { break; }
        remote.write_all(&buffer[..n]).await?;
        
        // 每 200ms 推送进度
        app.emit("transfer-progress", &progress)?;
    }
    Ok(())
}

关键设计

  • 独立 SSH 连接,不阻塞终端
  • 后台 tokio::spawn 任务
  • 进度实时推送

sftp.png

功能亮点

  • 可视化文件树浏览
  • 拖拽上传文件
  • 右键菜单(下载、删除、重命名、压缩)
  • 传输进度实时显示

3.4 MCP 协议集成

这是本项目的核心特色:通过 MCP 协议让 AI 直接操作服务器。

mcp-flow.png

工作原理

  1. 用户对 Claude 说:"检查所有服务器的 CPU 使用率"
  2. Claude 通过 MCP 协议调用 iTerminal 的工具
  3. iTerminal 连接服务器执行命令
  4. 结果返回给 Claude 进行分析

MCP 工具定义

const tools = [
  {
    name: "iter_connect",
    description: "创建 SSH 连接",
    inputSchema: {
      type: "object",
      properties: {
        host: { type: "string" },
        port: { type: "number", default: 22 },
        username: { type: "string" },
        password: { type: "string" }
      },
      required: ["host", "username", "password"]
    }
  },
  {
    name: "iter_exec",
    description: "执行命令",
    inputSchema: {
      type: "object",
      properties: {
        id: { type: "string" },
        command: { type: "string" }
      },
      required: ["id", "command"]
    }
  },
  {
    name: "iter_monitor",
    description: "获取系统监控数据",
    inputSchema: {
      type: "object",
      properties: {
        id: { type: "string" }
      },
      required: ["id"]
    }
  }
];

使用示例

用户:检查所有生产服务器的 CPU 使用率

Claude:
1. 连接到生产服务器
2. 执行 top 命令获取 CPU 使用率
3. 分析结果:
   - Server 1: CPU 使用率 45%
   - Server 2: CPU 使用率 72%(偏高)
   - Server 3: CPU 使用率 38%
   
建议:Server 2 的 CPU 使用率较高,建议检查是否有异常进程。

四、踩坑记录

4.1 Tauri 2 迁移问题

问题:Tauri 1 的配置文件格式在 Tauri 2 中不兼容

解决

  • 使用 tauri migrate 命令自动迁移
  • 手动检查 tauri.conf.json 配置
  • 注意 allowlist 改为 capabilities

4.2 russh async 注意事项

问题:在同步上下文调用 async API 会死锁

解决

  • 使用 tokio::spawn 包装 async 调用
  • 避免在主线程阻塞等待

4.3 xterm.js 中文支持

问题:中文输入时出现乱码或光标错位

解决

  • 设置正确的字体(如 JetBrains Mono)
  • 配置 termios 的 UTF-8 支持
  • 服务端检查 locale 设置

4.4 文件传输性能

问题:大文件传输时进度事件过多导致 IPC 阻塞

解决

  • 使用 64KB 缓冲区
  • 限制进度事件频率为每 200ms 一次
  • 独立 SSH 连接避免阻塞终端

五、系统监控功能

除了基础的 SSH 和 SFTP,还实现了实时系统监控:

监控指标

  • CPU 使用率(总体 + 各核心)
  • 内存使用(含 Swap)
  • 磁盘使用(多分区支持)
  • 系统信息(主机名、系统、内核、运行时间)

特点

  • 可配置刷新频率(1/3/5/10 秒)
  • 颜色预警(>70% 警告,>90% 危险)
  • 暂停/恢复功能

六、未来规划

功能优先级状态
密钥认证计划中
密码加密存储计划中
断线自动重连计划中
命令片段库计划中
分屏终端计划中
团队协作长期规划
AI 日志分析计划中
审计日志计划中

七、开源地址

如果觉得有用,欢迎 Star ⭐


八、总结

通过 Tauri 2 + React + Rust 的组合,我们开发了一款:

  • 轻量:安装包仅 15MB,内存占用 50MB
  • 安全:Rust 内存安全保证
  • 智能:MCP 协议支持 AI 操作
  • 开源:MIT 协议,完全免费

希望这个项目能帮助到更多开发者提升运维效率!


技术栈:Tauri 2.10 + React 19.2 + TypeScript 5.9 + Rust + russh 0.50

关键词:SSH、Tauri、Rust、React、MCP、Claude、AI、运维工具