Tabby 修改版:更美观的现代终端

Tabby 修改版:更美观的现代终端

侵权声明:本文为原创技术分享,如有侵权行为,请通过以下方式联系我们下架处理:

  • 邮箱:jzh@879869954@163.com

项目地址

下载地址

目录


为什么给 Tabby 做二次开发

Tabby 是一款基于 Electron + Angular + xterm.js 的开源终端模拟器,跨 Windows / macOS / Linux 三端,原生集成了 SSH 客户端、SFTP、串口终端、分屏、主题等能力,是 PuTTY、iTerm 的强力替代品。日常运维使用中,我们逐渐积累了几个原版难以满足的诉求:

  • 连接 Linux 服务器后,想看 CPU、内存、磁盘、网络负载,得手动敲 top、df -h、nload,繁琐且不直观;
  • 终端没有命令自动补全,长命令反复敲,效率低;
  • 日志刷屏时,error、warning、IP、路径混在一起,一眼看不出重点;
  • SSH 配置一多,没有分组、没有批量导入导出,换机器就要重新配置一遍;
  • 原生界面略显陈旧:标签页、滚动条、窗口边框都不够精致。

核心增强一:SSH 服务器资源监控面板

这是本次改造最核心的功能。连接 SSH 后,窗口右侧会常驻一个服务器监控面板 ,无需额外安装任何远端 Agent,直接通过 SSH exec 通道读取 Linux 的 /proc 文件系统来采集数据。

面板包含五个页签:

页签 监控内容 数据来源
总览 CPU 使用率、内存、磁盘、网络、运行时长、负载 /proc/stat、/proc/meminfo、/proc/uptime 等
处理器 各核心使用率与历史曲线(保留 60 个采样点) /proc/stat
内存 总量/已用/可用/缓存,含使用率进度条 /proc/meminfo
磁盘 各挂载点容量与使用率(过滤 tmpfs/overlay) df -P -B1
网络 收发字节、速率(Rx/Tx)、错误计数 /proc/net/dev

实现上有几个值得说明的细节:

  • 零依赖采集 :把多条采集命令拼接成一条 echo "@@TABBY_MON_XXX@@" 分隔的复合命令,一次性 requestExec 取回,再用分隔符切段解析,把 SSH 往返开销降到最低;
  • 3 秒刷新 + 30 秒缓存:面板每 3 秒刷新一次,同时做 30 秒的静态缓存,多开标签页时共享,避免重复采集;
  • 可拖拽调宽:面板宽度支持在 280px~500px 之间拖拽调整,适配不同屏幕;
  • CPU 历史曲线:保留最近 60 个采样点,实时绘制使用率走势。

核心增强二:命令历史候选提示

长时间运维后,很多命令早已记在 shell 历史里,却总要靠 ↑ 翻找。本次改造为本地与远程终端都加上了命令历史候选提示:输入命令前缀时,下方自动弹出候选面板,回车即可补全。

实现分为两条线:

  • 本地终端 :只读解析本地 shell 历史文件------.bash_history(bash)、.zsh_history(zsh,含 : 时间戳:耗时; 扩展格式)、fish_history(fish 的 YAML 格式)、PowerShell 的 ConsoleHost_history.txt。解析时做了去重、去时间戳前缀,最多索引 2 万行、返回 5 条候选。
  • SSH 远程终端 :通过 SSHCommandSuggestionProvider 读取远端 shell 的历史文件,同样做前缀匹配。

性能与安全上也做了专门处理:历史文件有变化(按 mtime 判断)才重新加载,冷启动预热后每 2 秒增量刷新一次,避免每次按键都卡在文件 IO;且只读不写 ------交互中输入的密码、交互式答案永远不会进入候选,杜绝泄露。

核心增强三:终端语义高亮

原版终端输出只有单调的前景色。这次通过一个规则引擎 semanticHighlighter.ts,在 xterm.js 前端对每一行输出做正则匹配,按优先级给不同语义上色:

语义类型 匹配示例 颜色
错误 fatal、error、failed、denied 红
警告 warn、warning、deprecated 黄
成功 success、ready、running、ok 绿
信息 info、IP 地址(1.2.3.4) 青
链接/路径 https://...、/usr/local/bin、C:\... 强调色
时间/调试 2024-01-01 12:00:00、debug、trace 灰

规则按优先级排序、逐字占用避免重叠,并会自动剔除路径/链接末尾的标点符号。刷日志时,ERROR 会跳出来,路径和时间一眼可辨,排查效率提升明显。

核心增强四:远程目录同步

使用 SFTP 面板传输文件时,最烦的是面板目录和终端当前目录不一致。本次改造加入了远程目录同步 :终端 cd 到哪里,SFTP 面板就自动跟随到哪里。

实现原理很轻量------通过 remoteCWDIntegration.service.ts 探测远端 shell(bash/zsh),向 .bashrc 或 .zshrc 注入一段带标记的 PROMPT_COMMAND / precmd hook,通过 OSC 1337(\033]1337;CurrentDir=...)把当前工作目录上报回来。注入块用 # >>> Tabby CurrentDir v1 >>> 与 # <<< Tabby CurrentDir v1 <<< 包裹,可安全地重复写入或清除,文件写入采用「临时文件 + rename」的原子方式,避免损坏原有配置。

首次打开 SFTP 时,会弹窗询问是「仅本次启用」还是「永久写入配置」,用户可随时取消。

核心增强五:SSH 配置导入导出与分组管理

当主机数量多起来,配置管理就成了刚需。本次改造新增了SSH 配置的 CSV 导入导出,并把主机选择器改造成了带搜索、分组、折叠的分组管理界面。

CSV 导入导出 (profileTransfer.ts):

  • 支持 主机名称、协议、主机地址、端口、用户名、认证方式、分组 等字段;
  • 导出时密码、私钥、私钥密码走加密 Vault 存储,不落明文;
  • 导入时自动按「主机地址 + 端口 + 用户名」去重,跳过已存在主机并统计跳过数;
  • 分组列可自动创建多级分组(按路径 A/B/C 建树)。

分组管理 (profileSelectorModal):

  • 主机按分组树展示,支持折叠/展开(折叠状态持久化到本地);
  • 顶部搜索框按名称、描述、分组路径、类型实时过滤;
  • 独立的「最近使用」「全部主机」视图,以及快速连接入口。

界面优化:从细节打磨到窗口重构

除了功能,这次还系统性地重做了界面,让整体观感从「能用」走向「精致」。以下为本次界面优化的要点:

窗口与标题栏

  • 弃用 Windows 原生 WCO(Window Controls Overlay)覆盖层,改用自绘 WindowControlsComponent,在 thin/full 框架模式下渲染统一的最小化/最大化/关闭按钮;
  • 窗口支持 8px 圆角(rounded-window),最大化/全屏时自动切回直角,避免圆角遮挡。

标签页

  • 标签由生硬的矩形改为圆角胶囊样式(7px 圆角),激活态用半透明前景色描边高亮,视觉层次更清晰;
  • 标签默认宽度由 200px 收窄到 180px,同屏可容纳更多标签;
  • 新增连接状态指示灯:绿点表示已连接、红点表示已断开,分屏标签也能继承聚焦子标签的状态;
  • 支持 displayTitle 自定义标题,与系统标题解耦。

滚动条

  • 全局滚动条宽度由 10px 收窄到 5px,两端圆角,视觉更轻盈。

设置页响应式

  • 引入 CSS @container 容器查询,设置表单在宽屏下左右排布、窄屏下自动竖排,适配不同窗口宽度。

文件传输面板

  • 由原来的下拉菜单重构为居中悬浮面板 :半透明遮罩 + 毛玻璃(backdrop-filter: blur(10px)),传输进行时按钮底部带一条流动的「跑马灯」动画(marching-ants),直观提示传输状态。

右键菜单

  • 重构为独立的 ContextMenuService + ContextMenuComponent,菜单项按权重分组,低频项收进「More」子菜单,主菜单更清爽。

终端工具栏

  • 优化 pointer-events,悬浮工具栏不再遮挡点击区域。

原版 vs 二开版功能对比

能力 原版 Tabby 二开版
SSH 服务器监控 无,需手动敲命令 右侧常驻面板,CPU/内存/磁盘/网络/总览,3s 刷新
命令历史补全 无 本地 4 类 shell + SSH 远程自动补全
语义高亮 无 错误/警告/成功/URL/路径/IP/时间着色
远程目录同步 需要在.bashrc中手动设置 SFTP 跟随终端 cwd,自动注入 hook
配置导入导出 无 CSV CSV 导入导出,密码/私钥加密,分组映射
分组管理 平铺列表 分组树 + 搜索 + 折叠 + 最近使用
窗口标题栏 原生 WCO 自绘控件 + 8px 圆角
标签页 矩形 200px 圆角胶囊 180px + 连接状态灯
相关推荐
吴声子夜歌5 天前
Shell编程实例——编写安全的shell脚本(二)
linux·运维·shell
吴声子夜歌7 天前
Shell编程实例——内务及管理任务(一)
linux·运维·shell
吴声子夜歌7 天前
Shell编程实例——高级脚本编程(一)
linux·运维·网络·shell
吴声子夜歌7 天前
Shell编程实例——bash的配置与自定义(二)
linux·运维·shell
吴声子夜歌8 天前
Shell编程实例——与解析相关的任务(二)
linux·运维·shell
吴声子夜歌8 天前
Shell编程实例——脚本编程的附加特性
linux·运维·shell
云计算练习生8 天前
什么是内核?操作系统内核到底管哪些事
linux·windows·操作系统·内核·shell
吴声子夜歌11 天前
Shell编程实例——bash入门
linux·运维·shell
Swizard11 天前
Linux 日志神器 journalctl 完全指南:彻底替代传统日志查看方式
shell
吴声子夜歌12 天前
Shell编程——数组
linux·运维·shell