最近一段时间,我继续完善了自己的 C++/Qt Windows 桌面项目 DirBridge。
在上一篇文章中,我主要介绍了 DirBridge 的第一阶段能力:本地与远程双栏文件管理、FTP/SFTP 目录浏览、站点配置、多远程会话、上传下载、拖拽传输和全局传输队列。
这些功能解决了“文件怎样在本地与服务器之间流动”的问题。但在真实的开发和部署过程中,传完文件通常并不意味着工作结束。上传构建产物之后,往往还需要执行脚本;修改配置之后,可能需要重新加载服务;发现异常时,还要继续查看进程、日志和运行状态。
如果每次都要离开文件管理工具,再单独打开终端、查找服务器信息并重新连接,整个操作过程就会被拆成几段。
因此,DirBridge 在原有远程文件管理能力的基础上加入了内嵌 SSH 终端,希望把文件操作和远程命令连接成一条连续的工作流:
在同一个界面中浏览和传输文件,然后直接打开对应服务器的 SSH 终端,继续完成命令操作。
项目地址:
GitHub:https://github.com/shy117/DirBridge
Releases:https://github.com/shy117/DirBridge/releases
一、DirBridge 当前的整体形态
DirBridge 目前仍然是一款面向 Windows 的 FTP/SFTP 双栏文件管理工具,但它已经不再只处理文件传输。
当前主要工作区域包括:
- 左侧的站点和会话管理;
- 中间的本地与远程文件面板;
- 底部的传输队列、日志和 SSH 终端;
- 多个彼此独立的远程文件会话与终端标签。
文件面板负责浏览目录、上传下载、拖拽传输和远程文件操作;SSH 终端负责执行交互式命令。两者放在同一个主窗口中,但在实现和生命周期上保持独立。
这种组合不是简单地“再增加一个终端页面”,而是让 DirBridge 从单一的文件传输工具,逐步变成一个面向远程操作的桌面工作台。
当前内嵌终端已经支持:
- 多个独立 SSH 终端标签;
- ANSI 颜色和基础终端属性;
- 光标、滚动历史和窗口尺寸变化;
- 文本选择、复制和粘贴;
- 中文输入、双宽字符和组合字符;
- Tab、方向键及常用终端键盘操作;
- 终端区域最大化;
- 右键直接粘贴。
二、为什么文件管理之后还需要 SSH
以一次常见的部署过程为例,操作可能包括:
- 在本地找到构建产物或配置文件;
- 通过 SFTP 上传到服务器的目标目录;
- 登录同一台服务器;
- 检查文件是否到位;
- 执行部署脚本、重启服务或查看日志;
- 根据结果继续修改和上传文件。
文件传输与命令操作本来就是连续发生的,但传统工作方式经常需要在文件管理器和终端软件之间来回切换。
DirBridge 加入 SSH 终端后,可以从当前 SFTP 站点或远程文件会话直接进入同一服务器的终端。连接信息来自已有站点,文件面板和终端也可以同时保留在界面中。
这样,用户关注的不再是“应该打开哪个工具”,而是当前任务本身:文件是否上传成功,命令是否执行完成,服务器返回了什么结果。
三、文件操作与命令操作形成连续工作流
加入 SSH 终端后,DirBridge 可以覆盖一条更完整的远程操作流程:
选择本地文件 ↓ 上传到 SFTP 远程目录 ↓ 从当前站点或会话打开 SSH 终端 ↓ 进入相同的远程目录 ↓ 检查文件并执行命令 ↓ 根据结果继续上传、下载或编辑整个过程中,本地文件、远程目录、传输结果和终端输出都能在同一个窗口中看到。
1. 上传文件
首先在文件面板中选择本地文件并上传到目标目录,通过传输状态确认任务已经完成。
2. 打开 SSH 终端
DirBridge 为 SSH 终端保留了两个入口,SSH 终端可以复用已保存 SFTP 站点的连接信息。
上传完成后,可以从已保存的 SFTP 站点直接打开 SSH 终端:
如果当前正在操作一个已经打开的 SFTP 远程文件会话,也可以从对应的会话标签打开终端:
这两个入口是同一步骤的两种选择,不需要依次执行。前者适合从站点开始操作,后者适合在文件管理过程中继续进入终端。
3. 进入目录并执行命令
SSH 连接建立后,可以进入刚才上传文件的远程目录,使用pwd、ls -l或其他测试命令检查文件和环境。
上面的四张截图分别展示了文件上传、两种终端入口和命令执行结果,完整呈现了从文件管理进入远程命令操作的过程。
这种体验对远程编辑同样有帮助。远程文件可以使用 Windows 默认应用打开,保存后同步回原路径;随后可以直接切换到终端进行格式检查、运行脚本或观察程序输出。
DirBridge 并没有把所有功能强行揉成一个流程,而是让文件管理、远程编辑和终端在需要时自然衔接。
四、SSH 终端与 SFTP 不是同一条连接
虽然 SFTP 和 SSH 都与远程服务器有关,但它们在 DirBridge 中承担不同职责。
SFTP 文件链路主要负责:
- 远程目录读取;
- 文件上传和下载;
- 新建、删除、重命名和移动;
- 远程文件编辑同步;
- 传输任务、进度和失败状态管理。
SSH 终端链路主要负责:
- 启动交互式远程 Shell;
- 接收键盘输入并持续显示远程输出;
- 维护光标、颜色、屏幕状态和滚动历史;
- 处理窗口尺寸变化;
- 管理每个终端标签的连接与关闭过程。
DirBridge 的 SFTP 文件功能继续由 libcurl 和原有传输体系负责,SSH 终端则通过 Windows ConPTY 与系统 OpenSSH 客户端建立独立链路。
这样划分有几个直接好处:
- 关闭或断开一个文件会话,不会自动关闭已经创建的终端;
- 一个终端连接失败,不会中断正在进行的文件传输;
- 多个终端标签可以分别维护自己的输入、输出和生命周期;
- 文件传输队列不需要承担交互式终端字节流。
两条链路共享用户入口和工作场景,但不会因为界面整合而混淆各自职责。
五、Windows 原生 SSH 终端技术路线
DirBridge 当前采用的终端链路可以概括为:
输入会从 Qt 界面传递到终端会话,再经过 ConPTY 和ssh.exe发送到远程服务器;服务器返回的内容则沿相反方向进入终端内核,最终由 Qt 控件绘制到界面上。
1. 使用系统 OpenSSH 建立连接
DirBridge 没有重新实现 SSH 协议,而是使用 Windows 自带的 OpenSSH 客户端,也就是ssh.exe,完成远程登录和数据传输。
主机指纹验证、SSH 密钥、Agent 和known_hosts等能力仍由 OpenSSH 负责。这样既可以复用 Windows 已有的 SSH 环境,也能避免在应用内部维护另一套 SSH 协议实现。
2. 使用 ConPTY 承载交互式终端
ssh.exe是一个控制台程序,Qt 图形界面不能只靠普通输入输出重定向,就完整支持光标移动、窗口尺寸变化和全屏终端程序。
DirBridge 使用 Windows ConPTY 在图形界面与ssh.exe之间建立伪终端通道。它负责传递键盘输入、终端输出和窗口尺寸变化,让远程 Shell 获得接近真实终端的运行环境。
每个终端标签都有独立的终端代理进程,用来管理自己的 ConPTY、ssh.exe和输入输出通道。关闭某个终端标签不会影响其他终端,也不会因为文件会话断开而结束已经建立的 SSH 连接。
3. 使用终端内核解析和绘制内容
ConPTY 负责传递终端数据,但不会替应用解释颜色、光标位置、字符宽度和屏幕状态。
DirBridge 使用 Ghostty VT 运行库维护终端状态,再把解析后的画面交给 Qt 控件绘制。Qt Widgets 负责标签、布局、键盘、输入法、文本选择和最终显示。
这也是为什么内嵌终端不能简单地使用一个多行文本框实现。一个真正可交互的终端还需要正确处理 ANSI 颜色、中文双宽字符、滚动历史、光标控制,以及vim、top等全屏终端程序使用的屏幕模式。
六、运行环境、兼容性与当前限制
DirBridge 当前面向 Windows x64,内嵌 SSH 终端还依赖以下系统能力:
- Windows ConPTY;
- Windows 系统 OpenSSH 客户端。
发布包已经包含 Qt、libcurl、Ghostty VT 和必要的运行组件,但系统 OpenSSH 仍需由当前 Windows 环境提供。
DirBridge 将 SSH 终端作为一项相对独立的能力。即使当前环境不满足终端运行条件,FTP/SFTP 文件浏览和传输功能也不应该受到影响。这种边界可以避免为了增加终端功能,直接提高整个文件管理工具的最低系统要求。
不同 Windows 版本在 ConPTY 的关闭和资源回收行为上可能存在差异。为此,DirBridge 使用独立终端代理进程隔离每个终端会话,使终端标签关闭或异常退出时,相关进程和资源能够沿明确边界回收,而不会影响长期运行的主界面进程。
目前项目已经验证了终端创建、输入输出、窗口尺寸调整、重复连接和关闭流程。不过,不同 Windows 版本、服务器环境、远程 Shell 和网络条件仍可能带来差异。
vim、nano、top等全屏程序,以及中文输入、复制粘贴和长时间运行会话,仍需要在更多真实环境中持续验证。项目当前仍处于迭代阶段,在重要数据环境中使用前建议保留备份,并优先在专用测试目录中确认自己的工作流程。
七、当前状态与后续方向
截至本文编写时,DirBridge 已发布v0.7.2。
SSH 终端并不是一个孤立增加的页面。它与文件浏览、文件传输和远程编辑共同组成了 DirBridge 当前的远程操作流程:
- 通过本地与远程文件面板管理文件;
- 使用传输队列查看上传、下载和目录任务;
- 使用 Windows 默认应用编辑远程文件并同步回服务器;
- 从 SFTP 站点或文件会话直接打开 SSH 终端;
- 在终端中继续执行命令、检查文件和查看运行结果。
在加入 SSH 终端之后,项目也继续完善了远程文件操作、目录传输状态、任务取消、列表状态保持和远程编辑缓存等基础体验。
这些改进的目标不是单纯增加功能数量,而是让用户在处理文件、执行命令和查看结果时,始终能够明确当前操作对象和执行状态,不同文件会话、传输任务和终端连接之间也不会互相干扰。
接下来,DirBridge 会重点推进:
- 在更多 Windows 版本和真实服务器环境中验证 SSH 终端;
- 完善全屏终端程序、中文输入和复制粘贴体验;
- 优化终端连接失败、关闭和异常退出时的提示;
- 继续提高远程文件操作和传输流程的稳定性;
- 根据实际使用反馈完善文件管理、远程编辑与命令操作之间的协作体验。
DirBridge 仍处于持续开发阶段。当前目标不是快速扩展成一个大而全的远程管理平台,而是在清晰的模块边界下,把文件管理、文件传输、远程编辑和 SSH 命令操作逐步连接成一套稳定、顺畅的工作流。
总结
第一阶段的 DirBridge 解决了本地与远程服务器之间的文件管理问题。加入内嵌 SSH 终端后,它开始继续解决文件到达服务器之后的操作问题。
从 SFTP 站点或远程文件会话打开终端,可以减少重复查找连接信息和切换工具的过程;独立的 SFTP 与 SSH 链路,则让文件传输和交互式命令各自保持清晰职责。
对我来说,这次迭代的价值不只是把 ConPTY 和 OpenSSH 接入 Qt 界面,而是让“上传文件、执行命令、查看结果、继续调整”成为一条更自然的工作流。
如果你也对 C++/Qt 桌面开发、Windows 终端、OpenSSH 或远程文件管理工具感兴趣,欢迎关注 DirBridge,也欢迎反馈实际使用中遇到的问题。
GitHub:https://github.com/shy117/DirBridge
Releases:https://github.com/shy117/DirBridge/releases