·
2 commits
to main
since this release
v0.2.0 — TUI 模式 & 单项执行
发布时间:2026-06-10
本版本是 U2Secure 的重大功能更新,新增 ratatui 终端图形界面(TUI),保留原有 CLI 交互方式,同时引入多项体验改进。
🆕 新功能
TUI 终端图形界面
基于 ratatui + crossterm 实现的终端图形界面,布局清晰、交互流畅。
界面布局:
┌─ Title ────────────────────────────────────────────┐
├─ 审计摘要(紧凑单行,自动换行)───────────────────┤
├──────────────────────┬─────────────────────────────┤
│ 步骤列表(左面板) │ 操作提示 / 执行状态 │
│ ▸ [✓] 系统更新 │ ▶ 正在执行: 用户创建 │
│ [✓] 用户创建 │ ✅ 已完成: 系统更新 │
│ [ ] SSH root │ 📊 ████████░░ 6/10 │
├──────────────────────┴─────────────────────────────┤
│ ↑↓/jk Space Enter e r q │
└────────────────────────────────────────────────────┘
支持功能:
- 自动审计 → 展示报告 → 步骤选择 → 批量执行 → 实时日志 → 结果摘要
Space勾选/取消步骤(按审计状态预选)Enter批量执行(流式顺序,右面板实时日志 + 进度条)e单项执行 — 不依赖勾选,直接执行光标所在步骤
三级启动路由
| 命令 | 模式 | 说明 |
|---|---|---|
u2secure |
交互选择 | 弹窗选择 CLI 或 TUI |
u2secure -t / --tui |
TUI | 直入 ratatui 界面 |
u2secure -c / --cli |
CLI | 直入传统 dialoguer 向导 |
✨ 改进
TUI 弹窗交互(ED25519 密钥设置)
执行 SSH 密钥设置时,全程在 TUI 内通过弹窗完成:
- 输入用户名 — 弹出输入框手动键入
- 选择操作 — 生成新密钥 / 粘贴已有公钥 / 跳过
- 粘贴公钥(如选择)— 粘贴 ssh-ed25519 / ssh-rsa 公钥
不再回退到 CLI 终端,体验更流畅。
自动换行
- 审计摘要区域高度从 3 行增至 5 行,配合
Wrap自动换行显示全部审计项 - 执行日志区域添加
Wrap,长消息不截断 - 摘要面板错误原因自动折行
失败/跳过原因展示
摘要面板中,失败/跳过的步骤会附带 : 原因 显示(灰暗色),例如:
❌ 禁止 root SSH 登录: 前置条件不满足: 禁止 root 登录前请先创建 sudo 用户
⏭ 安全扫描: lynis 无法自动安装,请手动安装后重新运行
SshKeySetup 独立执行
当系统中无 sudo 用户时,ED25519 密钥设置步骤现在允许手动输入目标用户名,不再依赖已有用户。
版本号编译时注入
标题栏和 CLI 欢迎语的版本号改为 env!("CARGO_PKG_VERSION") 编译时读取,只需维护 Cargo.toml 一处。
📦 依赖变更
| 依赖 | 操作 | 版本 |
|---|---|---|
ratatui |
新增 | 0.28 |
crossterm |
新增 | 0.28 |
🔧 文件变更
| 文件 | 操作 | 说明 |
|---|---|---|
Cargo.toml |
修改 | 添加 ratatui、crossterm 依赖 |
src/main.rs |
重写 | 三级路由(交互选择 / CLI / TUI) |
src/presentation/mod.rs |
修改 | 注册 tui 模块 |
src/presentation/cli.rs |
修改 | collect_step_params 改为 pub;SshKeySetup 支持手动输入用户名 |
src/presentation/tui.rs |
新增 | ~600 行 ratatui TUI 完整实现 |
README.md |
更新 | 添加 TUI 模式、启动方式、操作键说明 |
doc/versions/v0.2.0.md |
新增 | 本文件 |
涉及 i18n 改动的模块: domain/ · application/ · infrastructure/ · presentation/cli.rs · tests/
✅ 验证
cargo check— 零错误零警告cargo test— 45/45 通过cargo clippy --all-targets— 仅预存测试警告cargo fmt— 格式规范
🌐 国际化(i18n)
v0.2.0 新增完整国际化支持,覆盖三种语言:
| 语言 | 缩写 | 说明 |
|---|---|---|
| English | en |
英文 |
| 简体中文 | zh_cn |
默认语言 |
| 繁體中文 | zh_tw |
繁體中文 |
启动流程:
$ sudo u2secure
? 选择语言 / Select Language
▸ 简体中文
English
繁體中文
? 请选择启动模式 / Select Launch Mode
▸ TUI 模式(终端图形界面)
CLI 模式(传统交互式)
已翻译内容覆盖:
| 模块 | 覆盖范围 |
|---|---|
| 步骤标签(12 项) | domain/steps.rs → StepKind::label() |
| 审计项名称 & 详情 | infrastructure/system.rs → run_full_audit() |
| 领域错误消息 | domain/errors.rs → Display impl |
| 步骤执行结果 | application/steps.rs → 12 个步骤结果消息 |
| 包装错误说明 | 所有 PreconditionFailed、SystemCommandFailed 包装消息 |
| CLI 界面 | 欢迎语、提示、确认、总结等全部用户可见字符串 |
| TUI 界面 | 标题栏、面板标题、操作提示、快捷键、弹窗标题/提示/选项、执行日志、结果摘要 |
| 回退描述 | infrastructure/rollback.rs |
| 日志前缀 | infrastructure/logger.rs |
未翻译(保持原文):
- 原始系统命令输出(如
{e}、{stderr}中的错误详情) - 英文命令名(如
update、ufw、sshd等)
技术实现:
- 零外部依赖,纯 Rust
OnceLock+ match 实现 - 全局语言状态在
main.rs启动时通过dialoguer::Select设定 - 通过
crate::i18n::tr("key")/.replace("{var}", val)注入动态参数 - 未翻译的 key 返回 key 本身,不会崩溃
What's Changed
- Feat v0.2.0 by @cherish-ltt in #1
New Contributors
- @cherish-ltt made their first contribution in #1
Full Changelog: v0.1.1-release...v0.2.0-release