本文最后更新于 2026-07-19,文章内容可能已经过时。

前段时间闲来无事,基于 GitHub 上 Alexander Nt. 老哥的 Reach 项目进行了一次「私人定制的二次开发」。我将这个项目命名为:CoreOps

GitHub仓库地址:

https://github.com/Daniel-King-8/CoreOps

为什么要自己造轮子?

市面上 SSH 客户端很多,Xshell、Termius、Tabby 都用过。但总感觉差点意思——我想要一个懂中文、能唠嗑、会干活的 AI 运维助手,而不是一个冷冰冰的终端框。

Reach 这个项目底子不错:

  • Tauri v2 做的,安装包才几 MB,比 Electron 那些动辄几百 MB 的轻多了

  • Rust 后端,原生 SSH 实现,不依赖 OpenSSL/OpenSSH

  • Svelte 5 前端,够新够快

  • 内置加密 Vault,安全性有保障

唯一的问题:这项目是外国老哥写的,只有英文和欧洲语言,没有中文,没有 DeepSeek,AI 还得走 OpenRouter。

那就开干吧。

都改了些什么?

一、汉化,彻底的汉化

原项目只支持英文 + 德法意俄等 7 种欧洲语言。我补了一份完整的 zh.json,把将近 1000 条 UI 文本全部翻译成了中文。还顺手给语言选择器加了五星红旗。

现在切到中文,整个界面从菜单到侧边栏到设置页,全是中文。看着舒服多了。

二、接入了 DeepSeek,支持自定义 API

原项目 AI 只支持 OpenRouter,一个 US 的 API 聚合平台。我改成了自定义 API 地址,默认指向 https://api.deepseek.com/v1

设置页里加了个「API 接口地址」输入框,想用中转站或者换其他模型,直接改地址就行,不用改代码。

三、写了个「四模式」AI 权限系统

让 AI 直接操作服务器是挺危险的,所以我设计了一套权限控制:

  • 普通模式:AI 能看,想改想执行得问我

  • 纯计划模式:AI 只能分析,不让碰任何命令

  • 自动编辑模式:AI 可以改配置文件,但 systemctl restart 这种危险操作要等我点头

  • 全自动模式:完全放权,AI 随便搞(界面会变红警告)

自动编辑模式有个「命令分类器」,能识别 aptyumsystemctlrm -rf 这类命令并拦截,防止 AI 手滑搞崩服务器。

四、Tab 隔离的 AI 记忆

这是最折腾的一个。

原项目的 AI 聊天记录是全局共享的——开两个 SSH 标签页分别连不同的服务器,AI 会把两台服务器的对话混在一起,回答张冠李戴。

我把 AI 上下文改成了 Map<tabId, AIContext> 的结构,每个标签页独立记忆,切换时自动保存恢复。现在 Tab A 的问话不会串到 Tab B。

五、拖拽排序,踩坑无数

会话列表的拖拽排序看起来简单,实际上在 Tauri 的 WebView2 里折腾了好久:

  • 先用 setPointerCapture 解决 WebView2 拦截鼠标事件的问题

  • 再用 getBoundingClientRect 做 Y 轴几何测算定位目标位置,替代脆弱的 elementFromPoint

  • 卡片之间的 margin 缝隙会导致松开放置时误判,加了个 ±12px 的偏移容错

  • Svelte 5 的 $state 虽然响应式,但 splice 改了数组不会触发视图更新,还得 sessions = [...sessions] 强制重绘

六、打断按钮

AI 思考的时候,发送按钮会自动变成红色方块停止按钮。点一下,AI 立刻停止生成,正在执行的命令也会终止,聊天记录里会加一条「操作已打断」。

这是个很实用的小功能——有时候 AI 跑偏了或者给了一堆没用的命令,不想等它说完。

七、一键执行

普通模式下,AI 回复的多条命令可以一键顺次执行,不用一个个点 Run。

八、更新弹窗加了关闭按钮

Tauri 自带的更新对话框没有关闭按钮,更新提示弹出来只能点「立即更新」或者干瞪眼。我写了个自定义弹窗,加了 × 关闭按钮 + 背景点击关闭 + 「稍后」按钮。

九、其他小修小补

  • 侧边栏支持鼠标拖拽调节宽度

  • ANSI 转义码清洗增强,journalctl 的输出不会再带乱码

  • Shell 会话标签页的 × 关闭按钮之前点了没反应,修了个 sed 残留的 Bug

  • 底部系统状态栏(CPU、内存、网速)不会被 AI 侧边栏挤变形了

技术栈一览

 前端:Svelte 5(Runes)+ TypeScript + Tailwind CSS v4
 后端:Rust + Tokio + russh(纯 Rust SSH)
 桌面框架:Tauri v2(比 Electron 轻很多)
 AI:DeepSeek API + 自定义 API 地址
 加密:XChaCha20-Poly1305 + Argon2id

写在最后

前前后后改了好几个月,代码量大概新增了 1 万多行。过程中踩了不少坑,尤其是 Tauri + Svelte 5 的搭配在国内资料很少,大部分时间都是对着源码硬啃。

但成品用起来是真的爽——日常连服务器排查问题,AI 一边看报错一边给建议,还能直接帮忙执行命令,省了不少事。

下一步计划加流式响应和联网搜索,让 AI 回复实时显示,不用等完整响应。

如果你也搞运维、喜欢折腾开源项目,欢迎来交流。


📬 有想法?有 bug?尽管砸过来!发邮件到 [email protected],每条必看~

CoreOps — 一个加了 AI 助手的 SSH 客户端

使用说明:

点击打开仓库链接后,点击右边下方的Releases,在里面寻找你对应的系统版本进行下载安装。因为在使用上确实和其他的ssh工具差不了多少,所以,我现在只针对于开启AI助手进行指导说明

如何配置AI

打开设置点击AI,

1.在标记的位置开启AI助手

2.的API接口地址是默认DeepSeek的接口地址,你可以根据自己的需求自行修改(我这里以DeepSeek为例做演示)

3.填好你在官网获取的API-KEY后点击验证,将会直接加载可使用的模型

4.在下方模型列表选择自己需要使用的模型即可

image-MBkt.png

5.关闭设置的窗口,在设置按钮的一旁会多一个新的蓝色按钮,点就后,即可打开AI运维助手,在对话框最前方即可选择对应的模式:普通模式,纯计划模式,自动编辑模式,全自动模式

image-WLSF.png