# myshell **Repository Path**: argustang/myshell ## Basic Information - **Project Name**: myshell - **Description**: 我想写一个好看且好用得shell工具 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-13 - **Last Updated**: 2026-06-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyShell 一款基于 Tauri v2 构建的跨平台 SSH/SFTP/FTP 桌面客户端,灵感来自 FinalShell。

MyShell

![Version](https://img.shields.io/badge/version-1.7.0-blue) ![Tauri](https://img.shields.io/badge/Tauri-v2-green) ![React](https://img.shields.io/badge/React-18-blue) ![Rust](https://img.shields.io/badge/Rust-1.70+-orange) ## 功能特性 ### 连接管理 - 支持 **SSH**、**SFTP**、**FTP** 协议 - 连接分组管理(树形结构) - **拖拽移动**:长按连接(600ms)拖到文件夹即可移动归类,拖拽中只展示文件夹、隐藏文件夹内连接,避免连接过多需下滑找目标;ESC 取消、空白区/同文件夹不触发,普通点击/双击不受影响 - **模糊搜索**:快速定位服务器连接 - **文件夹快速选择**:编辑服务器时可快速选择所属文件夹 - 导入/导出连接配置(AES-256-GCM 加密) - 连接配置持久化存储(SQLite + OS Keyring) - 代理支持(SOCKS5、HTTP) ### 终端功能 - 基于 xterm.js 的高性能终端模拟 - Catppuccin Mocha 深色主题 - **暗黑模式**:支持深色/浅色主题切换 - 终端自适应尺寸调整 - **连接状态指示**:tab 页顶部显示在线(绿色)/离线(红色)/异常(红色×)状态 - **连接失败重连**:tab 页右下角显示失败提示,支持一键重连 - **命令历史栏**:最近 50 条命令 + 钉住置顶 - **快捷命令**:全局快捷命令 + 服务器专属快捷命令,多行命令按行顺序一键执行(`#` 注释与空行自动跳过),支持广播到多终端 - **广播输入**:同时向多个终端发送相同命令 - ZMODEM 协议支持(rz/sz 文件传输) - 服务器状态实时监控(CPU、内存、磁盘) - **本地终端**:直连本地 PowerShell / CMD / WSL / 自定义 shell,作为可保存的连接,体验等同 SSH 终端 - **终端字体**:从系统已安装字体下拉选择(也可手输),默认字体栈 Nerd Font 优先,正确渲染 Powerline / 图标字形(Oh My Posh / Starship / powerlevel10k 等);支持**按连接单独覆盖字体** - **本地终端编码自适应**:cmd / Windows PowerShell 5.1 启动自动切 UTF-8,中文系统不再 GBK 乱码;并向 shell 声明 `TERM=xterm-256color` / `COLORTERM=truecolor`,提示符引擎完整渲染 ### 文件传输 - SFTP/FTP 文件浏览器 - 文件操作:上传、下载、重命名、删除 - 目录导航历史记录 ### 诊断与日志 - **结构化日志**:关键路径(启动、SSH 生命周期、连接管理、快捷命令)记录 `info` / `warn` / `error` 级日志,按天落盘,便于事后定位问题 - **日志自动清理**:默认保留 **7 天**,每次启动自动清理超期日志 - **动态调试**:需要更详细输出时设置环境变量 `RUST_LOG=myshell=debug` 提升日志级别 ### 安全特性 - 应用启动密码保护 - 登录密码与数据加密密钥(DEK)分离 - PBKDF2-HMAC-SHA256 密钥派生(600k 迭代,OWASP 2023 推荐;旧 vault 首次解锁时透明迁移) - AES-256-GCM 数据加密 - SSH 主机键 TOFU 验证(按 `(host, port)` 隔离,指纹变更自动拒绝) - 严格 CSP 白名单(关闭 XSS 暴露面) - OSC 52 剪贴板劫持防护 - 命令历史敏感命令过滤(passwd/sudo/密钥参数等不入库) - Tauri 命令加固:PEM 头校验、文件大小上限、路径校验、错误脱敏 - ZMODEM 写入路径保护(拒绝软链与系统目录) - 密码错误锁定机制(3 次错误锁定 5 分钟,每日最多 30 次) - 敏感信息存储于 OS Keyring - **安装器数据删除二次确认**:卸载/更新时勾选「删除应用数据」会弹危险提示并要求二次确认(默认「否」),明确告知将删除连接 / 密码 / 历史 / 密钥库且不可恢复,防止误删 ### 版本管理 - 自动版本备份(升级前) - 一键回滚到历史版本 - 最多保留 5 个备份版本 ### 应用更新 - **侧边栏底部版本号**:常驻显示当前版本,发现新版本时版本号旁出现绿点提示,点击打开关于对话框 - **登录后自动检查**:每次登录进入主页后台静默检测 Gitee 最新 release(网络超时 30s) - **左下角更新提示**:检测到新版本时左下角弹出「发现新版本 vX.X.X」卡片(带绿点),可忽略(按版本记忆) - **自动下载安装**:点「立即更新」后台下载安装包(带进度条)→「安装并重启」自动启动安装器并退出 App 接管安装;下载失败可回退浏览器手动下载 - **关于对话框**:手动「检查更新」+「去下载」+ 查看更新日志(内置 CHANGELOG,版本升级后首启自动展示) ## 更新日志 ### v1.8.0(2026-06-26) 连接回收与侧栏交互增强:删除的连接可找回,侧栏操作菜单重构,多项体验优化与问题修复。 #### ✨ 新增 - **连接软删除 + 回收站**:删除的连接可在「设置 → 找回连接」恢复,最多保留 30 条 - **找回连接窗口**:新增「找回连接」窗口,按删除时间倒序排列,支持单条找回、彻底删除和清空回收站 #### 🛠️ 优化 - **连接重命名移入 ⋯ 菜单**:连接重命名移入「⋯ 更多操作」菜单,连接右键不再弹菜单 - **删除二次确认弹窗**:删除连接和文件夹改为自定义确认弹窗,修复部分环境下系统确认框不弹出的问题 - **删除文件夹联动回收站**:删除文件夹时,其下连接一并进入回收站(可恢复),不再移到根目录 #### 🐛 修复 - **大尺寸背景图不生效**:选图后自动压缩到 1920px / JPEG,避免超出本地存储配额导致设置无效 - **终端光标/选区不可见**:强制光标使用高对比前景色,选区提升不透明度,解决部分用户看不到光标和选区的问题 ### v1.7.0(2026-06-25) 侧栏交互增强、会话管理面板、广播级联重连等新功能。 #### ✨ 新增 - **侧栏拖拽调宽**:连接管理面板支持拖拽调整宽度(宽度持久化),鼠标悬停连接名可查看全称及主机地址 - **会话管理面板**:新增「当前会话」与「广播」下拉面板,可查看全部标签页全称、快速切换与关闭,支持一键清理所有掉线会话 - **广播级联重连**:点击重连一个掉线会话,同广播组其他掉线会话自动一起重连 - **AI 选区预览折叠**:AI 助手选区预览默认单行展示,双击展开完整内容 ### v1.6.3(2026-06-25) 表单必填校验与 AI 交互细节优化。 #### 🛠️ 优化 - **AI 面板终端输出截断**:自动附带的终端输出限制为 5000 字符,超长时显示截断提示 - **AI 面板引用内容折叠**:用户引用内容默认单行,双击展开完整内容 - **新建连接必填校验**:保存时标红必填字段,自动聚焦首个未填项并抖动提示 - **连接名称自动填充优化**:手动修改名称后不再被主机输入覆盖 - **快捷命令必填标注**:名称和命令字段标注红色星号,未填写时禁用保存 - **自定义主题色校验**:颜色值增加 HEX 格式校验,非法输入时禁用保存 ### v1.6.2(2026-06-24) 更新流程体验打磨与安装稳定性修复。 #### 🛠️ 优化 - **更新弹窗简化**:去掉双层玻璃外壳,改为单层卡片;按钮文案改为「忽略」和「更新」 - **关于对话框「更新」按钮**:由「去下载」改为「更新」—— 点击后自动下载安装(进度条 + 安装并重启),下载失败才回退浏览器下载;同时保留「网页下载」按钮作为备选 #### 🐛 修复 - **「安装并重启」os error 740**:非管理员用户点「安装并重启」报错「请求的操作需要提升」—— 改用 `ShellExecuteW` + `runas` 触发 UAC 提权,普通用户也能正常升级 - **更新弹窗版本号双 v**:tag 已含 `v` 前缀时不再重复添加,修复显示 `vv1.6.1` - **进度条先跳中间再从 0 开始**:点击更新时进度条会先跳到中间再回到 0 —— 下载进度 `pct` 为 null 时的初始宽度从 30% 改为 0% ### v1.6.1(2026-06-24) #### 🐛 修复 - 修复「更新内容」对话框泄露 CHANGELOG 头部 HTML 注释(不再把 `` 显示在更新日志里) ### v1.6.0(2026-06-24) 应用更新:自动下载安装 + 登录即检查。 #### ✨ 新增 - **自动下载安装更新**:发现新版本后点「立即更新」,App 后台下载安装包(带进度条)→「安装并重启」自动启动安装器并退出 App 接管安装;下载失败可回退浏览器手动下载 - **左下角更新提示卡片**:检测到新版本时左下角弹出「发现新版本 vX.X.X」卡片(带绿点),可忽略(按版本记忆),替代原先的弹窗提示 - **登录后自动检查**:每次登录进入主页后台静默检测新版本(网络超时 30s),替代原先的 24h 节流 ### v1.5.1(2026-06-24) 开源准备与维护性更新(应用功能无变化,二进制行为与 v1.5.0 等价)。 #### 🛠️ 优化 - **发布脚本网络重试**:上传 Gitee release 遇连接超时自动重试 3 次,发布更稳 - **开源仓库整理**:移除脚本里硬编码的个人 cargo 路径(改用 `%USERPROFILE%` / `$HOME`,跨机器可移植);代码注释中脱敏用户名/主机名 #### 🔒 安全 - 应用逻辑与密钥存储无变化;本次为开源前仓库整理 ### v1.5.0(2026-06-24) 版本信息展示 + 自动检测更新体系首版。 #### ✨ 新增 - **版本号展示**:侧边栏底部常驻显示当前版本号(如 `v1.5.0`),点击打开关于对话框;发现新版本时版本号旁出现青色提示红点 - **自动检测更新**:启动后台静默检测 Gitee 最新 release(每 24h 节流一次,避免频繁请求);发现新版本首次弹出「发现新版本 vX.X.X」提示并提供「去下载」(同一新版本只提示一次,后续仅留红点,不打扰);关于对话框内可手动「检查更新」并「去下载」跳转浏览器。检测走 Rust 后端 `reqwest`,不受前端 CSP 限制 - **更新内容展示**:版本升级后首次启动自动弹出更新日志(CHANGELOG);首次安装静默不弹(不打扰新用户);更新日志内置打包,离线可用、与已装版本对应 - **连接测试按钮**:新建/编辑连接对话框新增「测试」按钮,保存前即可验证 SSH/SFTP/FTP/本地终端能否连通(支持新建填表与编辑模式 keyring 取密钥、代理、15s 超时、防空密码触发锁号);测试与真实连接共用同一条拨号+认证+主机键 TOFU 路径,结果含耗时与认证方式,失败给出可读原因 - **AI 配置测试按钮**:设置 → AI 助手,「保存 AI 配置」旁新增「测试」按钮,用当前表单值(含未保存的 API Key)发起一次最小请求验证,无需先保存;空 Key 回退用 vault 已存的,200 视为通过并回显模型回复片段,失败给出接口状态码与截断错误 - **AI 助手输入框加高**:主页 AI 助手输入框由 2 行加高到 4 行(minHeight 96px),随便几个字不再溢出,多行提问更舒适 - **连接拖拽移动**:连接管理侧栏支持长按连接(600ms)拖到文件夹即移动归类;拖拽激活时列表切换为「只展示文件夹」视图(隐藏文件夹内连接),避免连接过多需下滑才能找到目标文件夹;ESC 取消、空白区/同文件夹不触发,点击/双击等既有交互不受影响;移动后自动展开目标文件夹 - **启动白屏消除**:主窗口启动时先隐藏,前端首帧绘制完成后再显示,应用启动到登录页之间不再有白屏 #### 🛠️ 优化 - **新建连接字体字段移到底部**:新建/编辑连接对话框的「终端字体(可选)」从靠前位置移到表单最底部,让连接名称 / 主机 / 端口 / 认证等常用字段优先露出,字体外观项靠后更顺 - **一键发布流水线**:新增 `打包` 触发的自动发版流程(bump 版本 + 生成更新内容 + 打包 + 上传 Gitee release),`scripts/publish-gitee-release.mjs` #### 🔒 安全 - 更新检测 HTTP 放 Rust 后端,**无需放宽 CSP**(前端 connect-src 保持锁定);打开外链命令强制校验 `http(s)://` 前缀;检测失败一律降级为「无更新」,绝不抛错到前端 ### v1.0.0 首个正式发布版本。 #### ✨ 新增 - **快捷命令**:支持「全局快捷命令」+「服务器专属快捷命令」两级管理,多行命令按行顺序一键执行;行首 `#` 注释与空行自动跳过;支持广播到多个终端同时执行 - **结构化诊断日志**:启动、SSH 生命周期、连接管理、快捷命令等关键路径落盘 `info`/`warn`/`error` 日志;按天滚动,默认保留 **7 天**,启动时自动清理超期日志;支持 `RUST_LOG=myshell=debug` 动态提级 - **全新应用图标**:Aurora Prompt `>_`,OLED 暗底 + 极光辉光 + 靛蓝→青色品牌渐变,与应用视觉语言统一(源文件 `src-tauri/icons/source-a.svg`,可一键重新生成全套尺寸) #### 🎨 优化 - 连接管理侧栏交互重设计:新建按钮统一为渐变主操作、展开/收起改为圆形「边缝手柄」搭配旋转指示箭头 - 暗黑/亮色主题、终端在线/离线/异常状态指示、连接失败一键重连、连接模糊搜索、文件夹快速选择等体验打磨 #### 🔒 安全加固(延续 0.x) - PBKDF2-HMAC-SHA256(600k 迭代)密钥派生、AES-256-GCM 数据加密、SSH 主机键 TOFU、CSP 白名单、OSC 52 防护、密码错误锁定等 --- ### v1.2.x 本地终端与体验增强。 #### ✨ 新增 - **本地终端**:直连本地 PowerShell / CMD / WSL / 自定义 shell,作为可保存的连接,体验等同 SSH 终端;支持「启动命令」开 tab 自动执行 - **终端字体选择**:从系统已安装字体下拉选择(非手输),默认字体栈 Nerd Font 优先渲染 Powerline / 图标字形;支持按连接单独覆盖字体 - **安装器数据删除二次确认**:卸载/更新勾选「删除应用数据」时弹危险提示 + 二次确认(默认「否」),并改用直白文案,防误删全部连接 / 密码 / 历史 / 密钥库 - **以管理员运行**:设置面板可一键以管理员重启 MyShell(Windows UAC 授权),重启后所有本地终端获得管理员权限;自动检测并展示当前权限状态。本地终端继承 MyShell 权限,需管理员命令时整体提权重启即可(单连接提权受 ConPTY + UAC 完整性级别隔离限制) #### 🛠️ 优化 - 本地终端编码自适应:cmd / Windows PowerShell 5.1 启动自动切 UTF-8(中文系统不再 GBK 乱码),并向 shell 声明 `TERM` / `COLORTERM` 让提示符引擎完整渲染 - **对话框防误关**:设置 / 快捷命令 / 主密码 / 密码验证等弹窗,点击遮罩区域(操作框外)不再意外关闭,必须用关闭/取消按钮,避免误触丢失已填内容(行为与新建连接对话框一致) - **字体选择升级**:终端字体改为模糊搜索下拉——输入关键字(如 `nerd mono`)即时过滤、匹配片段高亮,自定义主题化下拉面板替换原生 datalist;支持 `↑↓` / 回车 / Esc 键盘导航,仍可手动输入任意字体名 ### v1.3.x 体验打磨与工程整理。 #### 🛠️ 优化 - **连接类型图标**:ssh / sftp / ftp / 本地连接图标改用 iconfont 字体图标(服务器 / SFTP / ftp / 电脑),替换原先跨平台渲染不一致的 emoji(🖥️ / 📁 / 📤 / 💻);侧栏、连接对话框、标签栏三处统一渲染,颜色按类型语义化(ssh 主蓝 / sftp 副青 / ftp 警告黄 / 本地次级灰) - **历史命令过滤**:仅由 a/d 字符组成的误触命令(如 "A"、"AD")不再进入历史命令 - **新建连接保存按钮悬浮**:底部「取消/保存」常驻可见,长表单无需滚到底即可保存 - **版本号单一源**:只需改 `Cargo.toml` 一处版本号,`tauri.conf.json` / `package.json` 自动同步(build 时) - **图标重生成**:用矢量源重新生成全平台图标,确保 exe / 安装器 / 各尺寸高清一致 - **本地终端输入错位修复**:修正终端列宽(cols)计算被容器 padding 污染的问题——承载 xterm 的容器在全局 `box-sizing:border-box` 下不应带 padding(会被 FitAddon 计入可用宽度、多算约 1 列),改为外层 wrapper 留内缩;本地 PowerShell / ConPTY 输入长命令时不再字符跳出界面、不再背景左移 - **本地终端输入错位修复(二)**:修字体异步加载导致列宽漂移——xterm 改字体后会重新测量单元格宽度却不重算 cols,现改为等字体真正加载完成(`document.fonts.ready`)再 `fit()` 并把正确 cols 同步给 PTY;避免 pwsh 的 PSReadLine 按过期列宽重绘输入行、把字符画进错误单元格(透明背景图下表现为"字符挤开背景") - **本地终端输入回卷错位修复(三)**:修终端与本地 PTY 的列数(cols)初始同步时机——PTY 以 80 列启动、PSReadLine 缓存后,若初始 resize(shell 未就绪时发送)被丢弃,后端会一直停在 80 列、与前端真实列数不符,导致输入超过 80 列时一方换行一方不换行、编辑行错位("背景左移"),换行后恢复;现改为首帧输出后多次延迟(0/250/600ms)把真实列数同步给 PTY,覆盖 PSReadLine/ConPTY 冷启动就绪窗口 ### v1.4.x AI 助手集成。 #### ✨ 新增 - **AI 终端助手**:右侧全局聊天栏(Cursor 风格),多提供商可切换(Claude / OpenAI / Ollama 本地)。四项能力:**命令生成**(自然语言→命令,一键插入终端)、**输出诊断**(选中报错或附带最近输出让 AI 排查)、**命令解释**、**服务器主动巡检**(预设只读脚本采集 CPU/内存/磁盘/进程/日志 + AI 流式健康报告)。流式回复 + Markdown 渲染 + 代码块复制/插入。API key 经主密码库(vault)AES-256-GCM 加密存储,AI 调用在 Rust 后端进行(key 不进前端)。支持**网络代理**(http / https / socks5,应对无法直连 Claude/OpenAI 的环境) #### 🔒 安全与健壮性加固 - **修复快捷命令类型漂移(线上 bug)**:命令历史/快捷命令的 IPC 字段统一为 camelCase,此前 `isGlobal`/`sortOrder`/`createdAt` 在前端读到 `undefined`,导致快捷命令分组错乱、排序失效 - **拒绝空密码 SSH 认证**:密钥库缺密码时返回明确错误,不再向服务器发送空串(避免触发账户锁定) - **文件读取 TOCTOU 加固**:私钥/背景图读取改为「打开一次 + 句柄取元数据 + 限长读」,杜绝路径二次解析被掉包绕过尺寸上限 - **回滚路径穿越防御 + 修复每次启动重复备份**:回滚版本号格式校验;回滚标记改写当前版本号(原 `X (rolled back)` 触发每次启动都备份) - **文件夹改名 LIKE 注入修复**:含 `%`/`_` 的文件夹名不再误匹配并改写其他连接的 `group_path` - **暴力破解锁定文件原子写**:`lockout.json` 改 tmp+rename,崩溃不再留半截文件静默重置计数 - **代理目标 host 校验**:拦截 `\r\n`/控制符,防 HTTP CONNECT 请求走私 - **其它**:`exec_once`/本地巡检输出加上限与超时防 OOM/卡死;`truncate` 步进 UTF-8 字符边界防 panic;FTP 时间格式改用 chrono;命令历史去重保留已置顶项;ZMODEM 下载路径防 `..` 逃逸 + 发送失败自动中止;多 tab 输入聚焦回归本 tab;AI 面板宽度持久化值 clamp;导入/导出密码失败即清零;自定义主题 hex 归一化 - **冗余清理**:删除未引用的 `PassphraseDialog` 组件、死导出(`lockVault`/`onSshExit`)、空 `forEach`、只写不读的 DOM 属性等 #### 🎛️ 体验优化(v1.4.1) - **广播去重**:同一个连接在两个 tab 同时打开并入广播组时,不再对同一台服务器重复发送按键(按连接去重,避免双执行) - **终端选区可见性**:修复选中文字几乎看不到选中色的问题(多主题选区透明度过低),现在选中范围有清晰的蓝底高亮 - **Windows 任务栏图标**:修复打包后任务栏显示默认图标(exe 图标正常但任务栏不对)——设置 AppUserModelID + 显式窗口图标,重新打包后任务栏/标题栏显示 MyShell 图标 - **连接排序**:侧栏文件夹下的连接已按名称(中文 locale)排序,确认无需改动 #### 🐛 修复(v1.4.2) - **SFTP 打开即报错修复**:连接后 SFTP 面板直接提示 `Read dir failed: No such file: No such file`。根因是初始路径用 `~`,而 SFTP 协议没有 shell、不会展开 `~`(把 `~` 当字面目录名),服务器上又没有该目录。改为后端用 SFTP REALPATH 把 `~` 解析成真实 home 路径后再列目录,新建/删除/重命名同步适配;从 home 进入子目录后地址栏自动显示真实绝对路径 - **编译阻断修复**:`Cargo.toml` 中 rusqlite 的 feature 拼写错误(`bundclaudled`,不存在的 feature)导致 cargo 全量编译失败,已改回正确的 `bundled` - **SFTP 点击目录报 "SSH session not found" 修复**:SFTP-only 账号(shell 秒退)连接后,shell 通道关闭会把整个 SSH session 连同连接句柄一起删掉,导致后续 SFTP 操作全失败。根因是 session 生命周期被绑死在 shell 通道上——russh 一条连接多路复用多个通道,shell 通道死 ≠ 连接死。改为 session 仅在显式断开时清理(shell 通道关闭只代表终端断开,不影响 SFTP 继续复用同一连接,行为与 FinalShell 一致);并修复关闭「已断开」标签页时后端 session 泄漏 - **SFTP 批量文件上传/下载**:工具栏新增「⬆上传」「⬇下载」按钮(仅 SSH 连接)。支持多选文件批量传输(本地→远端 / 远端→本地),覆盖已有同名单个文件,失败不中断整批;实时进度浮层显示当前文件、`i/N`、总进度条、错误列表。上传通过系统文件选择器选文件,下载先勾选远端文件再选目标本地目录 - **SFTP 连接不再误报「重连」**:SFTP-only / nologin 账户(登录 shell 立即退出)连接后不再弹出「连接已断开 / 重连」遮罩。根因是后端给 SFTP 连接也请求了交互 shell,nologin 账户 shell 秒退触发 `ssh_closed` 事件被前端误判为整条连接断开;改为 SFTP 连接跳过 shell 请求(SFTP 子系统本就独立于 shell 通道),只保留真·TCP 断开时的断连提示 - **SFTP 文件面板视觉统一**:文件夹图标/名称颜色改用与 SSH 终端一致的 accent 蓝(原为青绿色,与整体风格割裂);类型列去掉多色背景徽章改为纯文字标签降噪;文件图标精简、选中态整行高亮、行间距与全局缓动对齐——SFTP 与 SSH 标签现在视觉语言统一 - **FTP 连接日志与错误诊断**:FTP 连接失败原先后台无任何日志、且 `os error 10060`(TCP 握手超时)以裸字符串抛出,难以判断是 IP/端口填错还是网络不通。现在 FTP 连接全程落日志(按天滚动日志文件,与 SSH 对称),且 10060/超时类错误改写为中文诊断提示——指明这是网络可达性问题(防火墙/IP 端口/服务未运行)而非密码错误 --- ## 已知限制 - **中文输入法(IME)输入时终端会短暂左移**:这是 Windows ConPTY 对中文输入法预编辑串(composition string)宽度计算的[上游 bug](https://github.com/microsoft/vscode/issues/255285)(VS Code 终端同样存在,非应用层可根治)。字母 / 英文输入不受影响;输入法确认(空格 / 回车)后左移立即恢复。**缓解**:分段确认输入、避免单次超长拼音;待 Windows 更新修复 ConPTY。详见 `progress.md` 阶段 23。 --- ## 技术栈 | 层级 | 技术 | |------|------| | 前端框架 | React 18 + TypeScript | | 桌面框架 | Tauri v2 | | 终端模拟 | xterm.js + FitAddon + WebLinksAddon | | 后端语言 | Rust | | SSH 协议 | russh + russh-sftp | | FTP 协议 | suppaftp | | 数据库 | SQLite (rusqlite) | | 加密 | AES-256-GCM + PBKDF2 | | 密钥存储 | OS Keyring (keyring-rs) | ## 项目结构 ``` myShell/ ├── src/ # React 前端 │ ├── components/ # UI 组件 │ │ ├── App.tsx # 主应用入口 │ │ ├── Sidebar.tsx # 连接管理侧边栏 │ │ ├── TerminalPanel.tsx # 终端面板 │ │ ├── SftpPanel.tsx # SFTP 文件浏览器 │ │ ├── CommandBar.tsx # 命令历史栏 │ │ ├── SettingsPanel.tsx # 设置面板 │ │ └── ... │ ├── utils/ # 工具函数 │ ├── api.ts # Tauri 命令封装 │ └── main.tsx # 入口文件 ├── src-tauri/ # Rust 后端 │ ├── src/ │ │ ├── main.rs # Tauri 命令定义 │ │ ├── ssh.rs # SSH 连接管理 │ │ ├── sftp.rs # SFTP 文件操作 │ │ ├── ftp.rs # FTP 协议实现 │ │ ├── db.rs # SQLite 数据库 │ │ ├── vault.rs # 加密与密钥管理 │ │ ├── crypto.rs # 加密工具 │ │ ├── backup.rs # 版本备份 │ │ └── ... │ ├── Cargo.toml # Rust 依赖 │ └── tauri.conf.json # Tauri 配置 └── scripts/ # 构建脚本 ``` ## 快速开始 ### 环境要求 - Node.js >= 18 - Rust >= 1.70 - pnpm/npm/yarn ### 安装依赖 ```bash # 安装前端依赖 npm install # Rust 依赖会在首次构建时自动安装 ``` ### 开发模式 ```bash # 启动开发服务器(热重载) npm run tauri:dev # 或 cd src-tauri && cargo tauri dev ``` ### 构建生产版本 ```bash # 构建桌面应用 npm run tauri:build # 输出位置:src-tauri/target/release/bundle/ ``` ### 类型检查 ```bash # TypeScript 类型检查 npm run test:ts # Rust 编译检查 npm run test:rust # 同时检查 npm run test:compile ``` ## 配置文件 应用数据存储位置: | 平台 | 路径 | |------|------| | Windows | `%APPDATA%\myshell\` | | macOS | `~/Library/Application Support/myshell/` | | Linux | `~/.config/myshell/` | 配置文件说明: | 文件 | 说明 | |------|------| | `connections.db` | 连接配置数据库(加密) | | `vault.salt` | 密钥派生盐值 | | `vault.verifier` | 密码验证数据 | | `dek.enc` | 加密的 DEK(数据加密密钥) | | `vault.kdf` | KDF 算法与迭代数元数据(旧版本缺失,首次解锁自动生成) | | `lockout.json` | 密码错误锁定状态 | | `logs/` | 按天滚动的运行日志(`myshell-YYYY-MM-DD.log`,默认保留 7 天) | | `backups/` | 版本备份目录 | ## 快捷键 | 快捷键 | 功能 | |--------|------| | `Ctrl+Shift+T` | 新建终端标签 | | `Ctrl+W` | 关闭当前标签 | | `Ctrl+Tab` | 切换到下一个标签 | | `Ctrl+Shift+Tab` | 切换到上一个标签 | ## 开发说明 ### 添加新的 Tauri 命令 需要同步修改三个位置: 1. `src-tauri/src/main.rs` — 定义 `#[tauri::command]` 函数 2. 相关模块(`ssh.rs` / `sftp.rs` / `db.rs`)— 实现逻辑 3. `src/api.ts` — 添加 TypeScript 封装 ### 类型定义 共享类型(如 `ConnectionConfig`、`FileEntry`)需要在 Rust 和 TypeScript 两边定义并保持同步。 ## 许可证 MIT License ## 致谢 - [Tauri](https://tauri.app/) - 跨平台桌面应用框架 - [russh](https://github.com/warp-tech/russh) - Rust SSH 库 - [xterm.js](https://xtermjs.org/) - 终端模拟器 - [FinalShell](http://www.hostbuf.com/) - 设计灵感来源