# 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-07-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TU SSH — Flutter 跨平台 SSH 运维工具 一款纯 Dart 实现的 SSH 客户端,无原生桥接。集 **交互式 SSH 终端、SFTP 文件管理、远程文件编辑、多会话标签、服务器状态监控** 于一体,并附带 **横竖屏自适应布局、终端富文本着色、字号调节持久化**。 > 全部功能使用 Dart 实现,目标平台为 Android / iOS / Windows(桌面)。 ## 功能特性 ### 服务器连接管理 - 新增 / 编辑 / 删除服务器,本地持久化 - 两种认证方式:**密码认证** 与 **私钥认证**(支持加密私钥的 passphrase) - 配置仅存于设备本地(见下方「数据存储与安全」) ### 交互式 SSH 终端 - 基于 `dartssh2` 的真实 shell(PTY) - 手动输入命令、发送 Ctrl+C、清屏、重连 - 断线自动重连(指数退避,最多 5 次) ### 多会话标签(`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/ ├── main.dart # 入口:开启全方向旋转 + 初始化服务 ├── models/ │ ├── server_config.dart # 服务器连接配置(含明文密码/私钥) │ ├── server_stats.dart # 监控数据模型 + ServiceStatus │ ├── command_item.dart # 命令库条目 │ └── terminal_line.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 # 字号持久化 ├── 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 # 本地文件编辑器 ``` ## 技术栈与依赖 - **Flutter / Dart**(SDK `>=3.0.0 <4.0.0`) - `dartssh2` — SSH / SFTP 协议 - `shared_preferences` — 本地键值持久化 - `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` - ⚠️ **安全提醒**:`ServerConfig` 中的 `password`、`privateKey`、`passphrase` 目前以**明文 JSON** 写入本地存储,未加密。设备被他人访问时存在泄露风险。正式发布建议迁移到 `flutter_secure_storage`(Android Keystore / iOS Keychain)。 - 这些本地数据位于设备存储,**不在项目源码目录中**,因此提交到 Git / Gitee 不会泄露密码或私钥(前提是不把含敏感信息的配置文件手动加入仓库)。 ## 监控兼容性与说明 - 监控目标为常见 Linux 服务器,指标通过 `/proc`、`free`、`df`、`systemctl`、`ufw`、`apt` 等标准接口采集。 - 缺少某项能力时(如非 systemd、无 thermal 节点、未安装 ufw、非 Debian 系)会自动**降级**显示为「未知 / 正常 / 0」,不影响整体采集。 - OpenSSH 默认 `MaxSessions=10`;监控采用**单次 exec 合并所有采集命令**的方式,避免多次打开 session 通道触发 `SSHChannelOpenError(open failed)`。 - 监控为快照式采集,刷新可重新拉取最新状态。 ## 已知限制 / 后续计划 - [ ] 密码 / 私钥以明文存储,计划迁移到安全存储(`flutter_secure_storage`) - [ ] 监控为手动刷新快照,后续可加入定时自动轮询 - [ ] iOS / Windows 桌面端的签名与发布配置需各自完善 ## 自检对照 - [x] 横竖屏自动切换,无内容遮挡 - [x] 拖动字号滑块实时放大缩小,本地保存 - [x] DEBUG/INFO/WARN/ERROR 自动着色,关键字高亮 - [x] 大量日志用 `ListView.builder` 懒加载,滚动流畅 - [x] 旋转后滚动位置保留(同一 ScrollController),着色不失效 - [x] SFTP 浏览 / 下载 / 上传 / 远程编辑 - [x] 多会话 Tab 同时连接 - [x] 服务器状态监控多指标卡片展示