# tu_ssh **Repository Path**: yunwolf/tu_ssh ## Basic Information - **Project Name**: tu_ssh - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-07-15 - **Last Updated**: 2026-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TU SSH — Flutter 跨平台 SSH 运维工具 一款纯 Dart 实现的 SSH 客户端,无原生桥接。集 **交互式 SSH 终端、SFTP 文件管理、远程文件编辑、多会话标签、服务器状态监控** 于一体,并附带 **横竖屏自适应布局、终端富文本着色、字号调节持久化**。 > 全部功能使用 Dart 实现,目标平台为 Android / iOS / Windows(桌面)。 ## 软件优点 - **纯 Dart 跨平台,零原生桥接**:无需编写平台专属原生代码,使用 `dartssh2` 在 Android / iOS / Windows 上获得一致的 SSH 体验,维护成本低、构建简单。 - **多端合一,无需多工具切换**:交互式终端、SFTP 文件管理、远程文件编辑、多会话标签、服务器状态监控集中在一个 App 内,覆盖日常运维主要场景。 - **凭据安全存储**:密码、私钥、私钥口令以及各厂商 AI Key 均保存在系统安全存储(Android Keystore / iOS Keychain / Windows DPAPI),不落明文、不上传。 - **输入方式灵活**:同时提供底部输入框与「直接点击终端输入」两种模式,可在 AppBar 一键切换,兼顾习惯与沉浸式终端体验。 - **护眼配色与自适应布局**:内置深色 / 浅色主题,浅色模式采用柔和浅蓝灰而非刺眼纯白;终端富文本着色,并针对横竖屏自动调整布局。 - **终端体验细节到位**:字号调节持久化、选择 / 复制、终端着色、自动滚动到底等细节开箱即用。 - **可扩展的 AI 智能排障**:错误日志内置 AI 分析,支持 GLM 与硅基流动等多厂商、按厂商隔离 Key、SSE 流式输出(边生成边显示),帮助快速定位错误原因与修复建议。 - **轻量开源,易于二次开发**:模块清晰(`screens` / `services` / `models` / `theme`),便于在现有架构上扩展新功能。 ## 功能特性 ### 服务器连接管理 - 新增 / 编辑 / 删除服务器,本地持久化 - 两种认证方式:**密码认证** 与 **私钥认证**(支持加密私钥的 passphrase) - 配置仅存于设备本地(见下方「数据存储与安全」) ### 交互式 SSH 终端 - 基于 `dartssh2` 的真实 shell(PTY) - 手动输入命令、发送 Ctrl+C、清屏、重连 - 断线自动重连(指数退避,最多 5 次) - **两种输入模式可切换**(终端页 AppBar 右侧切换按钮,已持久化): - **底部输入栏(默认)**:底部毛玻璃卡片输入框,提示「输入命令后按回车发送…」 - **点击直接输入**:去掉外框、输入框透明融入终端画面并显示绿色 `$` 提示符,点击终端画面任意处即聚焦输入框直接打字,观感更接近 PuTTY / Termius 等真终端 ### 多会话标签(`session_tabs_screen.dart`) - 以 Tab 形式同时管理多个终端会话 - 每个 Tab 持有独立的 `SshService` 实例,可同时连接不同(或相同)服务器 ### 分类命令库 - 分类标签 + 一键命令按钮 - 命令库可新增 / 编辑 / 删除,本地持久化 - 命令历史记录(最多保留 200 条,自动去重连续重复) ### SFTP 文件管理 & 远程编辑 - 浏览远程目录(文件夹在前、按名称排序,自动过滤 `.` / `..`) - 下载 / 上传文件(复用同一 `SSHClient` 的 `SftpClient`) - 一体化远程编辑流程:**下载 → 本地编辑器打开 → 保存即上传** - 支持通过 SFTP 新建远程文件(空白草稿 → 保存时远端创建) ### 服务器状态监控(`server_stats_screen.dart` + `server_stats_service.dart`) 连接后通过**独立的 SSH exec 通道**,一次性采集并可视化展示(含 `sleep 1` 前后两次采样计算的实时速率): | 类别 | 指标 | |------|------| | 系统概览 | OS / 内核 / 架构 / 主机名 / 当前时间 | | CPU | 总体使用率、各核心使用率、型号、负载(1/5/15 分钟) | | 内存 | 已用 / 可用 / 缓存、使用率 | | 磁盘 | 各挂载分区使用率、inode 使用率、实时读/写速率(MB/s) | | 网络 | 各网卡收/发速率(KB/s)、监听端口、TCP 连接数 | | 进程 | 进程总数 / 运行中 / 僵尸进程、Top 进程、登录用户 | | 服务状态 | Docker / Nginx / MySQL / PostgreSQL / Redis / MongoDB / PHP-FPM / Apache 是否在运行 | | 其他 | 文件描述符使用、开机时间、systemd 失败单元数、CPU 温度、防火墙状态、可更新软件包数 | ### 横竖屏自适应布局 - 全局开启四方向旋转,跟随系统自动旋转开关 - 竖屏:导航栏 → 终端(约 70%) → 输入框 → 横向命令栏 - 横屏:左侧命令库(约 30%) + 右侧(终端 + 输入框) - 旋转实时重绘、无闪烁、滚动位置保留、无内容截断 ### 终端字号调节 - 右上角菜单 →「文字大小设置」弹窗 - 滑动条 10pt ~ 24pt(默认 14pt),实时预览 + 实时刷新终端 - `shared_preferences` 持久化,重启 / 切换服务器 / 旋转均保留 - 「恢复默认」一键重置 14pt ### 终端富文本着色(`lib/utils/terminal_color_parser.dart`) - 纯 Dart 正则实现,输入原始字符串 → 输出 `List` - 优先级:ERROR > WARN > DEBUG > INFO > 关键字 > 普通文本 - 日志分级 + 路径 / 数字 / 端口 / 权限位 / Java 类名 / 成败关键词高亮 - 与 UI 解耦,仅作用于终端输出 ### 错误日志自动收集与查看(`lib/screens/error_log_screen.dart`) 针对 `tail` 类命令(如 `tail -f /var/log/app.log`,支持前导 `sudo`)的运维场景,自动从实时输出中识别并收集错误/异常行,并提供独立界面查看: - **自动捕获**:运行 `tail` 命令时自动开启输出错误行捕获;运行其他命令时关闭。对每一行按错误特征正则匹配(覆盖 `error / exception / traceback / fatal / panic / failed / denied / refused / timeout` 等英文,以及 `错误 / 失败 / 异常 / 拒绝 / 超时` 等中文),命中即收集。 - **上下文片段**:每条错误日志除命中行外,还截取命中行**前后各约 5000 字符**的上下文(兼容 `tail -f` 流式输出,捕获后延迟 800ms 再次补全,确保向后内容已到达),便于定位问题。 - **去重**:相邻重复行自动跳过,避免 `tail -f` 刷屏时重复堆积;上限 500 条。 - **查看界面**:终端页 AppBar 新增「错误日志」入口(带红色数量角标),打开后可按**关键字 / 命令**过滤、查看每条错误的时间 / 来源命令 / 错误原文 / 上下文片段(均可点选复制),并支持一键清空。 - **错误日志系统通知**:运行 `tail -f` 等实时捕获命令时,一旦输出中**新增错误/异常行**,会即时弹出系统通知(标题「检测到新增错误日志」并附带来源命令与错误原文),即使 App 在后台或屏幕被锁定也能第一时间察觉。通知按最小间隔(默认 3 秒)节流,避免 `tail -f` 刷屏时短时间内弹出大量通知。可在系统设置中关闭本应用通知。 - **AI 错误分析(可切换大模型厂商)**:错误日志页支持接入 AI 对单条日志进行智能分析。 - 右上角「AI 配置」对话框先选择**厂商**,再填写 **API 地址 / 模型名 / API Key**。内置两家 OpenAI 兼容协议厂商预设(选择后自动填入默认地址与模型,可手动覆盖): - **GLM(智谱)**:默认 `https://open.bigmodel.cn/api/paas/v4`,模型 `glm-4-flash` - **硅基流动(SiliconFlow)**:默认 `https://api.siliconflow.cn/v1`,模型 `Pro/zai-org/GLM-4.7` - **API Key 按厂商独立存储**:不同厂商的 Key 分别保存在系统安全存储的不同条目下(`tu_ssh_ai_api_key_`),切换厂商不会相互覆盖;切换厂商时自动载入该厂商已有的 Key。 - **流式输出**:点击「AI 分析」后通过 SSE 流式接收,结果边生成边显示(不再需要等待整段生成完成),对话框 loading 文案动态显示当前厂商名。 - 每条日志「放大查看」按钮后方新增「**AI 分析**」按钮,点击后调用所选厂商对「错误原文 + 前后上下文」进行分析,返回原因 / 排查步骤 / 修复建议,并在对话框内展示(结果区可上下滑动,含失败重试)。 - 涉及文件:`services/ai_service.dart`(多厂商配置枚举 `AiVendor` + OpenAI 兼容流式接口封装 + 按厂商隔离的 Key 持久化)、`screens/error_log_screen.dart`(配置对话框与分析按钮 / 流式展示)。 - 涉及文件:`models/error_log_entry.dart`(条目模型)、`screens/error_log_screen.dart`(查看页)、`screens/terminal_screen.dart`(捕获逻辑)。 ## 目录结构 ``` lib/ ├── main.dart # 入口:开启全方向旋转 + 初始化服务 ├── models/ │ ├── server_config.dart # 服务器连接配置(敏感字段脱敏落盘) │ ├── server_stats.dart # 监控数据模型 + ServiceStatus │ ├── command_item.dart # 命令库条目 │ ├── terminal_line.dart # 终端行模型 │ └── error_log_entry.dart # 错误日志条目模型 ├── services/ │ ├── ssh_service.dart # SSH 连接 + 断线重连 + 多会话 │ ├── sftp_service.dart # SFTP 浏览/下载/上传 │ ├── remote_edit_service.dart # 远程文件下载→编辑→上传流程 │ ├── server_stats_service.dart # SSH exec 采集服务器状态 │ ├── storage_service.dart # 服务器/命令库/历史持久化 │ ├── settings_service.dart # 字号持久化 │ ├── ai_service.dart # AI 多厂商配置 + 流式分析接口 │ └── notification_service.dart # 错误日志新增时的系统通知 ├── utils/ │ └── terminal_color_parser.dart # 核心:正则着色工具类 ├── widgets/ │ ├── terminal_view.dart # 富文本终端输出区 │ ├── command_launcher.dart # 命令库按钮面板 │ ├── history_launcher.dart # 命令历史面板 │ ├── command_edit_dialog.dart # 命令编辑弹窗 │ ├── font_size_dialog.dart # 字号设置弹窗 │ └── remote_edit_dialog.dart # 远程编辑状态提示 └── screens/ ├── server_list_screen.dart # 服务器列表(首页) ├── server_edit_screen.dart # 新增/编辑服务器 ├── command_manage_screen.dart # 命令库管理 ├── terminal_screen.dart # 终端页(横竖屏自适应) ├── session_tabs_screen.dart # 多会话标签页 ├── server_stats_screen.dart # 服务器状态监控 ├── remote_file_picker_screen.dart# 远程文件选择 ├── local_editor_screen.dart # 本地文件编辑器 └── error_log_screen.dart # 错误日志查看页(tail 自动收集) ``` ## 技术栈与依赖 - **Flutter / Dart**(SDK `>=3.0.0 <4.0.0`) - `dartssh2` — SSH / SFTP 协议 - `shared_preferences` — 非敏感配置键值持久化 - `flutter_secure_storage` — 加密存储密码 / 私钥 / 私钥口令 / 各厂商 AI Key - `flutter_local_notifications` — 错误日志新增时的系统通知(Android / iOS / macOS / Linux / Windows) - `http` — AI 大模型流式(SSE)请求 - `path_provider` — 临时 / 本地文件路径 ## 构建与运行 本仓库仅包含 Dart 源码。首次使用请在项目根目录生成各平台工程: ```bash # 1. 生成 android/ios/windows 等平台目录(不会覆盖已有 lib/) flutter create . # 2. 获取依赖 flutter pub get # 3. 运行(连接手机 / 模拟器 / 桌面) flutter run # 4. 打包 flutter build apk # Android flutter build ios # iOS flutter build windows # Windows 桌面 ``` > 说明:屏幕旋转通过 `SystemChrome.setPreferredOrientations` 在运行时开启, > Flutter 默认 AndroidManifest / iOS 配置即允许旋转,无需额外锁定方向。 ## 数据存储与安全 - 服务器配置、命令库、命令历史、终端字号均存于**设备本地存储**: - 非敏感元数据(名称 / 主机 / 端口 / 用户名 / 认证方式)通过 `shared_preferences`: - Android:`/data/data/<包名>/shared_prefs/<包名>_preferences.xml` - iOS:`Library/Preferences/.plist` - Windows:`%LOCALAPPDATA%\<应用名>\settings\*.json` - **敏感凭据(`password` / `privateKey` / `passphrase`)已加密存储**:由 `flutter_secure_storage` 写入系统级安全存储,按服务器 id 隔离: - Android:Keystore(启用 `encryptedSharedPreferences` 加密后端) - iOS / macOS:Keychain - Windows:DPAPI(系统级数据保护) - Linux:Secret Service(如 gnome-keyring) - `shared_preferences` 中仅保留脱敏后的占位(敏感字段为空),不再以明文落盘。 - 旧版明文数据在应用启动时会自动迁移到安全存储并清空本地明文(见 `StorageService._migratePlaintextSecrets`)。 - 这些本地数据位于设备存储,**不在项目源码目录中**,因此提交到 Git / Gitee 不会泄露密码或私钥(前提是不把含敏感信息的配置文件手动加入仓库)。 ## 监控兼容性与说明 - 监控目标为常见 Linux 服务器,指标通过 `/proc`、`free`、`df`、`systemctl`、`ufw`、`apt` 等标准接口采集。 - 缺少某项能力时(如非 systemd、无 thermal 节点、未安装 ufw、非 Debian 系)会自动**降级**显示为「未知 / 正常 / 0」,不影响整体采集。 - OpenSSH 默认 `MaxSessions=10`;监控采用**单次 exec 合并所有采集命令**的方式,避免多次打开 session 通道触发 `SSHChannelOpenError(open failed)`。 - 监控为快照式采集,刷新可重新拉取最新状态。 ## 已知限制 / 后续计划 - [x] 服务器状态监控支持**定时自动轮询**(默认开启,5 秒刷新一次,AppBar 开关可切换) - [ ] iOS / Windows 桌面端的签名与发布配置需各自完善 ## 自检对照 - [x] 横竖屏自动切换,无内容遮挡 - [x] 拖动字号滑块实时放大缩小,本地保存 - [x] DEBUG/INFO/WARN/ERROR 自动着色,关键字高亮 - [x] 大量日志用 `ListView.builder` 懒加载,滚动流畅 - [x] 旋转后滚动位置保留(同一 ScrollController),着色不失效 - [x] SFTP 浏览 / 下载 / 上传 / 远程编辑 - [x] 多会话 Tab 同时连接 - [x] 服务器状态监控多指标卡片展示