# 2026-05-26 — Terminal 左侧导航+右侧面板 + SSH密钥/连接修复 + 认证切换清理

## 变更摘要

1. **Terminal 左侧导航栏** — `sidebarOpen` 默认改为 `true`，与其他页面一致，可收起展开
2. **Terminal 右侧服务器面板** — 新增 `w-64` 右侧面板，显示当前服务器信息（名称/IP/状态）+ 所有服务器列表（可点击快速切换终端）
3. **面板切换按钮** — 工具栏新增 📋 按钮，可切换右侧面板显示/隐藏
4. **SSH 密钥双重加密修复（HIGH）** — `update_server` 预设解析时预先 `encrypt_value()`，遍历 ALLOWED_FIELDS 时又加密一次，导致 WebSSH 报 `Invalid private key`
5. **Server 8 数据修复** — 双重加密的 `ssh_key_private` 已重新单次加密
6. **认证方式切换清理（HIGH）** — 从密钥改密码时旧密钥数据未清除（`ssh_key_private`、`ssh_key_preset_id`、`ssh_key_configured` 残留），前端和后端都增加了联动清理逻辑
7. **SSH 主机密钥验证配置** — `SSH_STRICT_HOST_CHECKING` 改为 `false`（运维平台连接大量不可预知服务器，跳过主机密钥验证是业界标准做法）
8. **XSS 加固（审计追加）** — CSV 导入错误显示中 `e.name`/`e.domain`/`e.row` 加 `esc()`；预设 `<option value>` 中 `p.id` 加 `esc()`
9. **空 catch 消除** — servers.html 4 处 + servers.py 3 处 + terminal.html 2 处空 catch 全部加日志
10. **Terminal 错误消息 XSS 加固** — `msg.message` 和 `ev.reason` 加 `esc()` 转义

## 涉及文件

| 文件 | 改动 |
|------|------|
| `web/app/terminal.html` | 左侧导航默认展开、右侧服务器面板、面板切换按钮、esc() 加固、空 catch 加日志 |
| `server/api/servers.py` | SSH 密钥预设双重加密修复、认证方式切换联动清理（password→清密钥字段、key→清密码字段）、3 处空 except 改 logger.warning() |
| `web/app/servers.html` | 认证方式切换联动清理（密钥↔密码互清对方凭据）、CSV 导入错误 XSS 修复、预设 option value esc() 加固、4 处空 catch 加日志 |

## Bug 详情

### SSH 密钥双重加密（HIGH）

**现象**：WebSSH 连接使用 SSH 密钥预设的服务器时，报 `Invalid private key`。

**根因**：`update_server` 预设解析时 `encrypt_value(decrypt_value(preset.encrypted_private_key))` 已加密，遍历 ALLOWED_FIELDS 时又 `encrypt_value(value)` 再加密一次。`create_server` 无此问题。

**修复**：
1. `update_server` 预设解析改为存明文（与 `create_server` 一致）
2. Server 8 数据修复：双重解密 → 重新单次加密

### Terminal 错误消息未转义（MEDIUM）

**现象**：`msg.message` 和 `ev.reason` 直接拼接进终端输出，如果包含 ANSI 转义序列可能导致显示异常。

**修复**：用 `esc()` 过滤后输出

## 是否需迁移/重启

- **DB 迁移**: 无（server 8 数据已直接修复）
- **需重启**: 是（servers.py 后端改动已重启）

## 验证方式

1. 打开 terminal.html → 左侧导航栏默认展开 ✅
2. 右侧面板显示当前服务器信息 + 服务器列表 ✅
3. 点击服务器列表中其他服务器 → 跳转到该服务器终端 ✅
4. 收起右侧面板 → 终端区域自动扩展 ✅
5. 全屏模式 → 左右面板自动隐藏 ✅
6. Server 8 SSH 密钥解密：单次 decrypt_value() 得到 PEM 密钥 ✅
