# 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**: 1 - **Forks**: 0 - **Created**: 2026-06-13 - **Last Updated**: 2026-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyShell 一款基于 Tauri v2 构建的跨平台 SSH/SFTP/FTP 桌面客户端,灵感来自 FinalShell。

MyShell

![Version](https://img.shields.io/badge/version-1.10.1-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) - **连接高级选项**(SSH/SFTP):地址族(自动 / 强制 IPv4 / 强制 IPv6,绕开 IPv6 黑洞)、每连接连接超时、SSH Keepalive 间隔 - **主机密钥变更自助恢复**(SSH/SFTP):服务器重装/换密钥导致主机指纹变化时,报错明确列出新旧指纹(而非含糊的 "Unknown server key"),错误屏的「重新连接」按钮变为「重置密钥并重连」,一键自动清除旧记录并重新信任(保留 MITM 防护,不自动接受) ### 终端功能 - 基于 xterm.js 的高性能终端模拟 - Catppuccin Mocha 深色主题 - **暗黑模式**:支持深色/浅色主题切换 - 终端自适应尺寸调整 - **连接状态指示**:tab 页顶部显示在线(绿色)/离线(红色)/异常(红色×)状态 - **连接失败重连**:tab 页右下角显示失败提示,支持一键重连 - **命令历史栏**:最近 50 条命令 + 钉住置顶 - **快捷命令**:全局快捷命令 + 服务器专属快捷命令,多行命令按行顺序一键执行(`#` 注释与空行自动跳过),支持广播到多终端;支持**行间延迟**——三档模式:`##delay:500`(或 `##delay:1s`)在两行之间精确等待、固定延迟、或「智能等待」(监听终端输出,等上一行输出静止后再发下一行,自动适配命令速度、能处理 `sudo`/`mysql` 密码提示);在「设置 → 快捷命令」配置 - **广播输入**:同时向多个终端发送相同命令 - ZMODEM 协议支持(rz/sz 文件传输):原生 Rust 收发(零 JS 数据路径),128 KB 子包批量直写 SSH channel,进度 IPC 事件 100ms 节流削减跨进程开销,传输期间进度条实时显示、取消可用 - 服务器状态实时监控(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`,提示符引擎完整渲染 - **终端截图**:每个终端窗口工具栏的 📷 按钮一键截取当前终端画面(仅终端 viewport,不含标签栏/工具栏/输入命令栏),自动保存到「设置 → MCP 支持 → 附件目录」配置的目录,文件名带毫秒防覆盖;直接读 xterm buffer 自绘,完整还原颜色(16 色/216 cube/24 灰阶/24-bit RGB)和文字属性(bold/italic/underline/inverse) ### 文件传输 - 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 头校验、文件大小上限、路径校验、错误脱敏 - **日志脱敏**:主机名 / 用户名 / IP 在写入日志前掩码(如 `192.168.1.10`→`192.*.*.10`),反馈日志二次脱敏,密码 / 密钥本就不记录 - ZMODEM 写入路径保护(拒绝软链与系统目录) - 密码错误锁定机制(3 次错误锁定 5 分钟,每日最多 30 次) - 敏感信息存储于 OS Keyring - **安装器数据删除二次确认**:卸载/更新时勾选「删除应用数据」会弹危险提示并要求二次确认(默认「否」),明确告知将删除连接 / 密码 / 历史 / 密钥库且不可恢复,防止误删 ### 版本管理 - 自动版本备份(升级前) - 一键回滚到历史版本 - 最多保留 5 个备份版本 ### 应用更新 - **侧边栏底部版本号**:常驻显示当前版本,发现新版本时版本号旁出现绿点提示,点击打开关于对话框 - **登录后自动检查**:每次登录进入主页后台静默检测 Gitee 最新 release(网络超时 30s) - **左下角更新提示**:检测到新版本时左下角弹出「发现新版本 vX.X.X」卡片(带绿点),可忽略(按版本记忆) - **自动下载安装**:点「立即更新」后台下载安装包(带进度条)→「安装并重启」自动启动安装器并退出 App 接管安装;下载失败可回退浏览器手动下载 - **关于对话框**:手动「检查更新」+「去下载」+ 查看更新日志(内置 CHANGELOG,版本升级后首启自动展示) - **单实例检测**:启动时检测已有 MyShell 实例,弹窗选择「覆盖启动」(结束旧实例并继续启动)或「退出」(保持现有);覆盖启动优先优雅退出(清理会话),超时兜底强杀 ### CLI 与 MCP 服务器 MyShell 提供命令行工具和 MCP 协议服务器,让 AI agent(Claude Desktop、Cursor、ZCode 等)能直接使用已保存的 SSH/SFTP 连接。 **myshell-cli** — 命令行工具: ```bash myshell-cli list --json # 列出所有连接 myshell-cli exec myserver "uname -a" --json # 远程执行命令 myshell-cli sftp ls myserver /var/log --json # 列出远程目录 myshell-cli sftp get myserver /etc/hosts ./hosts # 下载文件 myshell-cli sftp put myserver ./file.txt /tmp/ # 上传文件 myshell-cli test myserver # 测试连接 myshell-cli ssh myserver # 交互式终端 ``` Vault 解锁:使用 `--passphrase` 参数,或交互式提示。 **myshell-mcp** — MCP 协议服务器(stdio 传输): ```json // Claude Desktop / Cursor / ZCode 配置 { "mcpServers": { "myshell": { "command": "myshell-mcp" }}} ``` > **安全模型**:MCP server 不存储 vault 密码,也不持有解密密钥。所有服务器访问必须经过 MyShell GUI——ssh_exec 在 GUI 终端标签页内执行(用户已在 GUI 中解锁 vault),SFTP 工具通过 IPC 向 GUI 请求解密后的连接凭证。GUI↔MCP 的 localhost IPC 桥要求**每条命令携带随机会话令牌**(写入用户配置目录的端口文件中,受用户目录 ACL 保护;令牌缺失/错误一律在分发动作前拒绝),本机其他用户的进程无法再窃取凭证。**所有工具(除任务状态查询)都要求保险库已解锁**:GUI 未运行时 MCP 自动拉起应用(含识别并清理崩溃残留的 IPC 端口文件);保险库锁定时立即返回明确的「保险库未解锁」错误并把 MyShell 窗口置顶(密码门正对用户),不做静默等待——解锁后重试即恢复。锁定状态下连 `list_connections` 都不可用,AI 无法获取任何连接元数据。 暴露 15 个 MCP 工具:`list_connections`、`ssh_exec`、`sftp_list`、`sftp_download`、`sftp_upload`、`sftp_mkdir`、`sftp_remove`、`sftp_rename`、`upload_project`、`download_project`、`test_connection`、`screenshot_terminal`、`open_in_gui`、`zmodem_download`、`zmodem_upload`。连接参数支持三种形式:name / group-path / host-IP;重名场景自动按工具类型(ssh vs sftp)消歧。高危操作(`ssh_exec` / `sftp_remove` / `sftp_rename` / `sftp_upload` / `zmodem_upload`)必须弹 OS 级对话框人工确认,AI 无法跳过;用户点「取消」拒绝时返回硬性停止(HARD STOP)错误——AI 必须立即停止当前任务的所有后续操作(不重试、不换工具绕过)、向用户输出任务进度说明,并等待用户明确确认是否继续(`ssh_run` 后台任务拒绝后经 `ssh_status` 同样处理)。`open_in_gui` 通过 localhost IPC 通道驱动 GUI 打开连接 tab 并聚焦窗口(需 GUI 正在运行):支持 `tab_type`(auto/terminal/sftp,可对 SSH 连接强制开 SFTP 文件浏览 tab),默认聚焦已有 tab(同一连接已打开时切换过去不重复开)。`zmodem_download`/`zmodem_upload` 通过远端 `sz`/`rz`(lrzsz)走 ZMODEM 协议传输文件,用于 SFTP 子系统不可用的受限 shell / 堡垒机 / 嵌入式设备场景——优先用 sftp_*,SFTP 不可用时才用 zmodem_*。 ## 更新日志 ### v2.12.2(2026-08-28) #### 🛠️ 优化 - **MCP 高危操作被用户拒绝后返回「硬性停止」指令**:AI 必须立即停止当前任务的一切后续操作(不重试、不换工具绕过),向用户输出当前任务说明(在做什么、已完成哪些步骤、被拒绝的是哪一步、剩余计划),等待用户明确确认是否继续。覆盖全部确认弹窗出口与异步任务(ssh_run / zmodem_upload),GUI 确认框提示语同步更新。 - **前后端依赖全量更新**:npm 漏洞清零(nanoid / postcss 两个 high)+ 21 包更新(tauri 前端套件最新补丁版);Rust 侧 160+ 包(tauri 2.11.5、rustls 0.23.43、russh-sftp 2.4.0 等)。React 19 / Vite 8 / xterm 6 / TypeScript 7 等大版本有意不升。 #### 🔒 安全 - **GUI↔MCP localhost IPC 桥增加随机会话令牌认证**:每条 IPC 命令必须携带端口文件中随 GUI 每次启动轮换的随机令牌,否则在分发动作前一律拒绝——本机其他用户的进程无法再在保险库解锁状态下窃取解密凭证。旧格式端口文件向后兼容;版本错配时返回明确的升级提示。 - **russh 0.50 → 0.60.3,修复两个 high 漏洞**(RUSTSEC-2026-0154/0153):恶意 SSH 服务器可触发无上限内存分配导致客户端拒绝服务。加密后端换预编译 ring(免 NASM/CMake 依赖),业务代码零改动,`cargo audit` 两个 high 清零。 ### v2.12.1(2026-08-24) #### 🐛 修复 - **AI 模型选择器即时刷新**:设置里新增模型后立即出现在 AI 面板的模型选择器中、立即可选(原先需重启应用)。头部标签与下拉高亮同步修正为显示当前实际选中的具体模型(原先固定显示供应商主模型,选了新模型看不出已生效)。 ### v2.12.0(2026-08-20) #### ✨ 新增 - **启动时单实例检测**:已有实例运行时弹 TaskDialog 选择「覆盖启动」(结束旧实例并继续启动)或「退出」(保持现有实例)。覆盖启动优先走 IPC 优雅退出(旧实例 `app.exit(0)`,正确清理 SSH/PTY 会话与 IPC 端口文件),超时兜底强杀;检测用 named mutex(`Global\MyShellSingleInstanceMutex`),进程崩溃自动释放、零 stale 风险。杜绝双实例并存导致的 SSH 会话分裂与 `gui-ipc-port` 互相覆盖(升级安装 / 误双击场景)。 #### 🛠️ 优化 - **MCP 调用时 GUI 未运行自动拉起应用**:所有工具统一走 `ensure_gui_running()`(原先仅 ssh_run 等少数路径会拉起,其余直接报错)。同时识别崩溃残留的陈旧 IPC 端口文件——探测端口无监听即删除残留并重新拉起 GUI;连接成功但无响应只报错不重启(避免触发单实例「覆盖启动」误杀挂起但存活的实例)。 - **保险库锁定时 MCP 立即提示,不再静默等待 30 秒**:原「每 3s 轮询、最多 30s」逻辑删除,改为单次状态查询直出错误;锁定时先经新增的 `focus_unlock` IPC 把 MyShell 窗口置顶(密码输入框正对用户),再返回可操作的「保险库未解锁」提示——AI 转告用户、解锁后重试即恢复。保险库未初始化(首次使用)同样立即给出引导。 #### 🔒 安全 - **MCP 保险库门禁覆盖全部工具**:豁免名单从 9 个收到 3 个(仅 `ssh_status` / `ssh_cancel` / `zmodem_status` 任务状态查询保留),`list_connections`、`open_in_gui`、`screenshot_terminal`、`zmodem_*`、`ssh_run` 全部纳入——锁定状态下 AI 无法获取任何连接元数据(连接名称 / 分组也不行)。 - **修复 upload_project / download_project 远端路径命令注入**:远端路径原先未转义直接拼进 `sudo mkdir/mv/tar/rm` 命令链与内联 Python 代码,含引号的路径可逃逸为 root 权限任意命令执行。现统一 `shell_quote()`(标准 `'\''` 转义),Python 打包命令改为环境变量传路径(`MYTAR` / `MYDIR`)。顺带修复:zmodem `sz` / `cd` 路径转义丢撇号、`download_project` 体积统计恒为 0(原先在删除临时文件后才读 metadata)、`screenshot_terminal` 输出的 user@host 恒为空(改用解密解析)。 ### v2.11.2(2026-08-17) #### 🛠️ 优化 - **MCP exec 互斥锁自愈**:GUI 端"上一条命令还在跑"误锁改为 Map+timestamp,超 60s 自动释放,不再需要重启 GUI。 - **MCP ssh_exec/ssh_run 输出上限可配置**:`MCP_SSH_MAX_OUTPUT_BYTES` 环境变量(默认 4 MiB,64 KiB~1 GiB),解决大镜像/大仓安装日志静默截断。 - **MCP 新增 `ssh_run`/`ssh_status`/`ssh_cancel`**:异步长任务通道——`ssh_run` 立即返回 task_id,`ssh_status` 轮询进度,`ssh_cancel` 中断 runaway 任务(保留截至取消点的输出)。适配 apt upgrade / docker pull / git clone 等 5min+ 任务。 - **ssh_exec 默认 timeout 30s → 60s**(上限 1h);`myshell-cli exec` 同步 60s + `--timeout` 范围校验 1s~3600s。 - Umami 统计事件名加 `myshell_` 前缀,与 zcode-assistant 区分。 ### v2.11.1(2026-08-13) #### 🛠️ 优化 - **快捷命令多行执行支持行间延迟**,避免下一条命令在交互提示/密码输入就绪前被提前送出。在「设置 → 快捷命令 → ⏱ 行间延迟」选择模式: - **智能等待**:监听终端输出,等上一行输出静止后再发下一行,自动适配命令速度,能处理 `sudo`/`mysql` 密码提示(推荐); - **固定延迟**:每行之间固定等待; - **关闭**:一次性全部发出(旧行为)。 - **行内延迟指令** `##delay:500`(或 `##delay:1s`)在两行之间精确等待,作为最小下限与模式叠加生效;命令编辑器标题旁新增 `?` 按钮可展开/收起编写规则说明。 ### v2.11.0(2026-08-10) #### ✨ 新增 - **MCP 新增 lrzsz(ZMODEM) 文件传输**:`zmodem_download`/`zmodem_upload` 覆盖 SFTP 子系统不可用的受限 shell/堡垒机/嵌入式设备场景。上传走 native pump 架构,中/大文件实测 SHA256 完全一致。 #### 🛠️ 优化 - **底部状态栏内存占用**改用内核 MemAvailable 口径,与 htop / node_exporter 一致,不再虚高。 - **rz 上传提速**:专用 pump task + 1 MB 批量写,子包 64→128 KB;进度 IPC 事件 100ms 节流(100MB 文件减少 ~8× IPC)。 #### 🐛 修复 - **MCP `ssh_exec` 高频调用导致 GUI 卡死**:IPC 监听器串行阻塞改为独立线程处理,单条命令不再冻结整个通道;移除 exec 每次抢焦点骚扰。 - **ZMODEM(rz) 上传中/大文件卡死**:ZEOF 收尾帧经跨进程回路丢失导致永久卡死,已重构为 native pump 架构 + fast-finish + 30s 超时双重兜底。 ### v2.10.0(2026-08-03) #### ✨ 新增 - **多窗口模式**:点击🪟多窗口按钮,选择多个 SSH 会话以网格布局同时展示。支持配置行列数、自动最大化、滚动溢出、动态均衡布局。 - **会话管理增强**:当前会话下拉新增全部重连/全部广播/每行广播开关;广播组下拉新增退出全部广播。 #### 🛠️ 优化 - **CommandBar 窄屏自适应**:窗口宽度不足时按钮只显示图标,防止输入框挤压。 ### v2.9.0(2026-07-30) #### ✨ 新增 - **防止 shell 空闲自动登出(TMOUT)**:连接高级选项新增独立开关,登录时注入 `export TMOUT=0`,不额外开通道、受限账号可用。 #### 🛠️ 优化 - **移除「应用级保活(exec 心跳)」**:该功能每 N 秒开 exec 通道会打死受限单会话账号;russh 15s keepalive 对普通服务器已足够,TMOUT 防护由独立开关覆盖。 #### 🐛 修复 - **窗口最小化后自动锁定不触发**:后台 webview 节流挂起定时器,新增窗口恢复前台时按时间戳补锁。 - **编辑连接后点「重连」仍用旧配置**:重连改为读取最新连接配置,与侧边栏重开一致。 ### v2.8.1(2026-07-30) #### 🐛 修复 - **SSH 应用级保活防不住 TMOUT 自动登出**:勾选保活后 SSH 仍被服务器以 `timed out waiting for input: auto-logout` 踢出。现改为仅对该连接在 shell 启动时注入 `export TMOUT=0`(不误伤其它会话、对编辑器无干扰),exec 心跳保留防 NAT 断连。 - **窗口最小化后自动锁定不触发**:后台 webview 节流挂起定时器导致不锁定,新增窗口恢复前台时按时间戳补锁。 ### v2.8.0(2026-07-29) #### ✨ 新增 - **空闲自动锁定**:无操作超过设定时长后自动锁定,需重新输入密码。设置→安全可配置(10分钟/30分钟/1小时/不启用),默认30分钟。 ### v2.7.0(2026-07-29) #### ✨ 新增 - **SFTP 传输取消**:下载/上传过程中可随时取消,后端 32 KB 块边界即时响应。 #### 🛠️ 优化 - **SFTP 传输进度面板重做**:仿 ZMODEM 四行布局,新增速度、开始时间、已用时间、预计剩余。 - **ZMODEM 进度面板增强**:新增开始时间、已用时间、预计剩余,刷新间隔改为 1 秒。 #### 🐛 修复 - **ZMODEM 下载大文件卡死**:改为 256 KB 缓冲批量写入,IPC 调用量降低 32 倍。 - **ZMODEM 原生下载文件大小不一致**:CRC 完整性检查提前到 payload 写入之前,消除子包重复写入。 - **ZMODEM 取消后终端打印垃圾**:改为 500 ms 时间窗口抑制协议尾字节。 ### v2.6.2(2026-07-27) #### 🐛 修复 - **服务器主机密钥变更后无法连接**:重装/换密钥后连接报含糊的 "Unknown server key" 且无法恢复。现报错明确列出新旧指纹,错误屏「重置密钥并重连」一键清除旧记录并重新信任(仅 SSH/SFTP,保留 MITM 防护)。 ### v2.6.1(2026-07-27) #### 🐛 修复 - **服务器主机密钥变更后无法连接**:服务器重装/换密钥后连接报含糊的 "Unknown server key" 且无法恢复。现报错明确列出新旧指纹,连接 ⋯ 菜单新增「重置主机密钥信任」(仅 SSH/SFTP),重置后重新信任;保留 MITM 防护,不自动接受。 ### v2.6.0(2026-07-26) #### ✨ 新增 - **连接高级选项(SSH/SFTP)**:连接对话框新增「高级选项」组——地址族(自动 / 强制 IPv4 / 强制 IPv6,绕开 IPv6 黑洞)、每连接连接超时(默认 10s)、SSH Keepalive 间隔(默认 15s)。默认值与原行为一致,不影响既有连接。 ### v2.5.5(2026-07-25) #### 🐛 修复 - **MCP 高危命令重复弹窗**:GUI 确认框超时后不再回退 headless 弹第二个 Windows 弹窗。只有 GUI 真正不可用才回退。 - **应用内检查更新检测不到新版本**:Gitee 的 `/releases/latest` 接口不可靠(一直返回 v1.11.2 而非真实的 v2.5.5),改用列表接口并在客户端用版本比较选出真正的最新版。 ### v2.5.4(2026-07-25) #### 🐛 修复 - **AI 面板「服务器信息」巡检在连接失效时报错**(`Open exec channel failed (ConnectFailed)`):现自动重连+重试一次,不再要求用户手动重连 tab。 ### v2.5.3(2026-07-25) #### 🐛 修复 - **MCP ssh_exec 长耗时命令导致会话挂起**:新增命令互斥锁——同一连接前一条没完成时拒绝新命令,提示 AI 用 `nohup ... &` + 轮询日志。 - **超时后 PTY 残留进程**:硬超时后发 `Ctrl+C` 打断残留进程,恢复干净 prompt。 ### v2.5.2(2026-07-25) #### ✨ 新增 - **MCP 工具调用等待保险库解锁**:AI 调用 ssh_exec / sftp_* 时若 GUI 未解锁,每 3s 轮询一次、最多等 30s,给用户输入主密码的时间。超时才报错。`list_connections` 不受影响。 ### v2.5.1(2026-07-25) #### 🐛 修复 - **匿名统计上报被 CSP 拦截**:`connect-src` 未放行 `cloud.umami.is`,Umami 后台收不到数据。已加白名单。 - **统计上报失败无法重试**:改为 fetch 成功后才写 version stamp,失败下次静默重试。 #### 🛠️ 优化 - **同意策略改为「同意一次后静默」**:不再每次升级都重新弹同意框。 ### v2.5.0(2026-07-25) #### ✨ 新增 - **MCP 会话超时自动原地重连**:服务器 TMOUT 踢断后复用同 tab + 终端快照保留历史,不再开新标签页。 #### 🛠️ 优化 - **MCP ssh_exec 会话复用提速**:会话已存在时从 5-6s 降至 <1s(砍掉 `open_connection` + 固定 sleep)。 - **MCP 大输出处理**:outputBuf 4MB 上限 + 尾部正则,避免 O(n²) 卡死。 - **保险库锁定快速失败**:MCP 命令立即报错,不再等 30s 超时。 #### 🐛 修复 - **MCP 双连接竞态**、**ssh_exec 输出丢失颜色**(ANSI 保留版定位)、**大输出命令误报超时**(sentinel 扫描窗口 2KB→16KB + 输出静止 5s 兜底)。 ### v2.4.0(2026-07-24) #### ✨ 新增 - **MCP `screenshot_terminal`**:AI 可请求 GUI 对终端 tab 截图(PNG data URL),用于视觉检查输出;GUI 未运行时自动拉起聚焦。 #### 🔒 安全 - **`list_connections` 不再泄露 host/port/username**:改用纯文本列查询,IP/用户名仅在 GUI 解锁后可访问;IP 直连查询要求 GUI 在线 + vault 解锁。 #### 🐛 修复 - **sz 多文件竞态挂起**(offer 丢失 → 队列缓冲)、**sz 收尾卡死**(写入未排干即关句柄 → `Promise.all` drain)、**sz 启动 rz 噪音**(切换点剥离 auto-start 通告)。 ### v2.3.0(2026-07-22) #### ✨ 新增 - **MCP upload_project / download_project**:AI 一键上传/下载整个项目目录(tar 打包 + SSH 管道直传)。 - **终端 sentinel 噪音过滤**:`__MCP_DONE_` 行在渲染层丢弃,终端零噪音(智能缓冲不影响交互)。 #### 🛠️ 优化 - **upload_project** SSH 管道直传替代 SFTP 分块,速度 10x+;download_project 支持 sudo tar + UTF-8 中文文件名。 - **sentinel 简化**:去掉 stty 三行辅助命令,改单行 sentinel + 截断式清洗。 - **命令确认规则 UI**:黑白名单改列表式——搜索、自动排序、字号放大、逐条删除。 #### 🐛 修复 - **ssh_exec 空输出**(订阅时序 + 提示符剥离)、**连续开新 tab**(focus_existing)、**stdout 残留辅助命令**(截断清洗)。 #### 🔒 安全 - **删除 MCP vault 密码 keyring 明文存储**:MCP 不再持有 DEK/passphrase,所有服务器访问强制经 GUI 解锁(ssh_exec 走 GUI tab,SFTP 经 IPC 解密凭证)。删除 GUI Vault 同步 UI + CLI save-passphrase。 ### v2.2.0(2026-07-22) #### ✨ 新增 - **MCP ssh_exec 界面同步展示**:AI 执行的命令现在实时显示在 GUI 终端 tab,用户可见可干预,输出回传给 AI(sentinel 标记法捕获 PTY 输出边界)。GUI 未运行时 MCP 自动拉起 `myshell.exe`。可在「设置 → MCP 支持 → 命令确认规则」开关。 #### 🛠️ 优化 - **ssh_exec 命令确认规则(黑名单正则 + 白名单豁免)**:只读命令(`ps`/`ls`/`cat`/`grep` 等)不再弹确认框,只有危险命令(`rm`/`kill`/`sudo`/写重定向/管道到 shell)才弹框;白名单豁免误报(`grep rm` 不误杀)。用户可在设置编辑黑/白名单和严格模式。19 个单元测试覆盖。 #### 🐛 修复 - **NSIS 升级报「无法打开要写入的文件:myshell-mcp.exe」**:安装/升级/卸载前新增对 `myshell-mcp.exe` / `myshell-cli.exe` 的运行检查(原先只检查主程序),被 AI 客户端常驻拉起时提前提示关闭。顺带修复 `myshell-mcp.exe` 重复打包 + 卸载 `Delete` 加 `/REBOOTOK`。 ### v2.1.0(2026-07-22) #### ✨ 新增 - **MCP `open_in_gui` 工具**:AI 可驱动 MyShell GUI 自动打开已保存连接的标签页并聚焦窗口(用户说"在 MyShell 打开 prod-db"即可)。通过 localhost TCP IPC 桥实现(MCP 与 GUI 独立进程,零新依赖、只绑 `127.0.0.1`);GUI 未运行时返回明确错误并建议改用 `ssh_exec`。 - **`tab_type` 参数**:`auto`/`terminal`/`sftp`(可对 SSH 连接强制开 SFTP 文件浏览 tab)。 - **智能聚焦**:默认聚焦已有 tab,同一连接已打开时切换过去不重复开。 - MCP 工具数 10 → 11。 ### v2.0.0(2026-07-21) > 重大版本:从「SSH/SFTP 客户端」进化为「AI agent 可集成的 SSH/SFTP 工作台」。新增 CLI、MCP Server、终端截图三大模块,提取 `myshell_core` 共享库实现 GUI/CLI/MCP 三二进制架构。 #### ✨ 新增 - **CLI 工具(myshell-cli)**:命令行访问已保存的 SSH/SFTP 连接,让 AI agent 和高级用户可在脚本/终端直接使用。支持 `list / exec / ssh / sftp / test / vault` 等命令,`--json` 输出对自动化友好。 - **MCP Server(myshell-mcp)**:通过 Model Context Protocol(stdio 传输)将 SSH/SFTP 能力暴露给 AI agent(Claude Desktop / Cursor / ZCode / opencode 等)。10 个工具:连接管理 + 远程命令执行 + SFTP 文件操作 + 连接测试 + 终端截图。 - **三二进制共享架构**:提取 `myshell_core` 库,GUI / CLI / MCP 三个二进制共享同一核心逻辑、同一 SQLite、同一 vault 和 keyring。 - **MCP 管理设置页**:「设置 → MCP 支持」集中管理:启用/禁用、自动检测已安装 AI 工具并一键写入配置。 - **MCP 连接智能查找**:连接参数支持 name / group-path / host-IP 三种形式;重名场景(同 IP 多类型)自动按工具类型消歧。 - **终端截图功能**:CommandBar 新增 📷 按钮,截取纯终端 viewport(不含标签栏/工具栏/输入栏)。读 xterm buffer 自绘,支持完整颜色和文字属性。文件名带毫秒防覆盖。 - **附件目录设置**:截图自动归档;保存后弹"已保存 + 打开"toast,跨平台调系统文件管理器并选中文件。 - **Linux deb 打包支持** + **应用内更新平台分发**(Windows=auto,Linux/macOS=browser)。 #### 🛠️ 优化 - **MCP 工具描述全面重写**:每个工具含 WHEN TO USE / WHEN NOT TO USE / OUTPUT / SIDE EFFECTS;新增 server-level `instructions` 字段(MCP 2025-06-18 规范)。 - **Cargo.toml `default-run = "myshell"`**:三二进制架构下 `cargo run` / `tauri dev` 不再需要 `--bin`。 #### 🔒 安全 - **MCP 高危操作人工确认**:`ssh_exec / sftp_remove / sftp_rename / sftp_upload` 必须弹 OS 级对话框,AI 无法跳过。 - **Vault 密码改用 Windows 凭证管理器(DPAPI 加密)**:替代明文环境变量方案,配置文件绝不出现明文密码。 ### v1.11.2(2026-07-17) #### 🐛 修复 - **匿名统计弹窗同版本重复弹出**:用户点击"暂不"后版本未标记已处理,导致下次启动再次弹窗;现在无论同意或拒绝都立即标记版本已处理,同一版本不再重复弹出 ### v1.11.1(2026-07-15) #### 🛠️ 优化 - **升级安装静默卸载旧版**:升级时双击新安装包,旧版本自动后台静默卸载(不再弹出旧版卸载向导界面),从"先卸载再安装"两步合并为一步 - **匿名统计每次升级都询问**:版本升级首次启动时都弹窗征求匿名统计同意,不再记住首次偏好后静默上报 #### 🐛 修复 - **长命令执行时 SSH 连接被误断**:执行长时间无输出的命令(如 `find | sort | uniq -c`)时 SSH 连接被 30 秒静默超时误杀,改用 keepalive 心跳维持连接(与 OpenSSH/MobaXterm 同机制),仅连续 3 次心跳无响应才判定断开 ### v1.11.0(2026-07-14) #### ✨ 新增 - **AI 设置界面左右布局**:左侧供应商列表(新建 / 选中 / 双击重命名 / 启用禁用开关),右侧详情编辑(预设模板下拉选择 / 基本信息 / 模型管理) - **供应商多模型管理**:每个供应商支持多个模型,可从接口自动获取可用模型(勾选添加)、手动添加、主模型标记 - **AI 聊天窗口两步模型选择**:先选供应商再选具体模型,仅展示已启用的自定义供应商 #### 🛠️ 优化 - **新建供应商校验**:需添加模型并通过测试后才可创建,避免无效配置 - **操作反馈改为 Toast 浮层**:测试 / 保存 / 删除等结果以顶部居中浮层提示 - **设置窗口固定高度**:切换类别时窗口大小不再跳变 - **测试针对性修复**:测试针对用户正在编辑的供应商而非全局活跃供应商 #### 🐛 修复 - **获取模型列表 key 无效**:新增服务端解密 key 的获取命令,保存后不再失败 - **alert 弹窗失效**:授权 dialog 权限,修复 Tauri v2 下 window.alert 被拦截 ### v1.10.2(2026-07-13) #### 🛠️ 优化 - **反馈提交改造**:弃用不稳定的 Web3Forms 和第三方图床(已封禁),改为唤起本地邮件客户端(mailto),反馈内容自动复制到剪贴板,弹窗提醒用户粘贴 - **Gitee Issue 入口**:反馈窗口底部新增 Gitee Issue 提交链接 - **反馈目录自动清理**:关闭反馈窗口时自动清空本地反馈包目录,防止磁盘堆积 - **资源管理器去重**:打开反馈文件夹时,如已有同名目录窗口则激活已有窗口,不再重复打开 #### 🐛 修复 - **打开反馈文件夹无效**:修复 `reveal_path` 白名单限制导致无法打开 feedback 目录的问题 - **反馈失败提示不明显**:提交失败时改为红色 ❌ 醒目提示,与成功状态明显区分 ### v1.10.1(2026-07-09) #### ✨ 新增 - **匿名版本统计**:每次版本升级首次启动时弹窗征求同意,匿名上报一次(随机设备 ID + 版本号 + 操作系统,不含任何连接信息),帮助了解各版本的真实用户覆盖量 ### v1.10.0(2026-07-09) #### ✨ 新增 - **左下角反馈入口**:侧边栏版本号右侧新增 💬 反馈图标,可提交问题报告 / 功能建议 / 其他反馈,支持截图(截屏或本地选图),自动附带脱敏后的运行日志,通过邮箱送达开发者;截图上传免费图床(ImgBB),提交失败时自动打包本地反馈包兜底 #### 🔒 安全 - **日志脱敏**:主机名 / 用户名 / IP 地址在写入日志前掩码(如 `192.168.1.10` → `192.*.*.10`),反馈日志二次脱敏;密码 / 密钥本就不记录 ### v1.9.1(2026-07-01) #### 🐛 修复 - **终端光标不闪烁**:修复连接后光标不闪烁、切换窗口后也不闪烁的问题(补全 focus 时序与窗口重新聚焦时的光标状态机重启) - **AI 上下文记忆丢失**:修复同一会话中 AI 不记得前文的问题(每次请求现在会携带完整对话历史) ### v1.9.0(2026-06-29) 终端渲染健壮性与可诊断性增强:渲染后端可选、光标更稳定、全链路日志监控,并重构设置面板为分类导航。 #### ✨ 新增 - **设置面板分类导航**:设置改为左右分栏,按「外观 / AI / 安全 / 数据管理 / 快捷命令」分类组织 - **终端渲染后端可选**:新增「自动 / Canvas / WebGL / DOM」渲染后端切换,解决部分用户光标和选区不可见的问题 - **全局日志监控**:前端崩溃、未捕获异常自动转发到后台日志文件,便于异常定位与用户反馈分析 #### 🛠️ 优化 - **终端默认改用 Canvas 渲染器**:配合条形光标(cursorStyle: bar),光标更稳定可见且不丢失闪烁 - **后端关键路径补全日志**:SSH / SFTP / 本地终端 / 数据库 / 备份 / AI / 代理 各模块失败与生命周期事件完整记录,会话链路可追溯 - **禁用 GPU 硬件加速开关**:设置新增「禁用 GPU 硬件加速」选项,作为 GPU 合成异常时的最终兜底(重启生效) #### 🐛 修复 - **光标样式遗留缺陷**:修复 forceVisibleCursor 注释声明 cursorStyle:"bar" 但代码从未实际设置的缺陷 ### 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 **Linux 额外构建依赖(用于打包 .deb):** ```bash sudo apt install -y \ build-essential pkg-config \ libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev \ libgtk-3-dev librsvg2-dev libglib2.0-dev libsoup-3.0-dev \ libsecret-1-dev libayatana-appindicator3-dev libdbus-1-dev ``` ### 安装依赖 ```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/ # - Windows: nsis/MyShell_x.y.z_x64-setup.exe # - Linux: deb/MyShell_x.y.z_amd64.deb(apt 安装时自动拉运行时依赖) ``` **Linux 安装:** ```bash # 推荐:apt install 会自动解决运行时依赖(webkit/gtk/secret/ayatana) sudo apt install ./src-tauri/target/release/bundle/deb/MyShell_*_amd64.deb # 不推荐 dpkg -i:它不会自动拉依赖,缺库时会配置失败 # 若已用了 dpkg -i,补救:sudo apt --fix-broken install ``` ### 类型检查 ```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/) - 设计灵感来源