TypePHP 编译器 https://swoole.com/aot/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

107 lines
4.3 KiB

# TypePHP SSH Tunnel Manager(Qt)
这是一个 TypePHP 桌面应用示例。Qt/C++ 只承担窗口、控件、UI 事件队列和
`QProcess` 桥接;规则校验、CRUD、JSON 持久化、SSH 参数生成、自动启动和运行
状态均由 TypePHP 实现。
## 功能
- 本地转发:把服务器可访问的目标端口映射到本地监听端口(OpenSSH `-L`)。
- 远程转发:把本地可访问的目标端口映射到服务器监听端口(OpenSSH `-R`)。
- SOCKS5:通过 SSH 服务器建立本地 SOCKS5 代理(OpenSSH `-D`)。
- 新建、查看、编辑和删除规则。
- 单条隧道启动、停止、状态展示和 SSH 输出日志。
- 支持中文输入法组合事件(Linux IBus/Fcitx、Windows TSF/IMM)。
- 表格列宽可拖动调整,刷新规则时不会重置列宽。
- 映射端点分别显示为“本机地址”和“远程地址”;远程转发会按实际方向交换显示。
- 状态列使用状态灯:运行中为绿色,已停止或错误为红色,过渡状态为橙色。
- 日志按隧道独立保存在内存中,选择表格行时只显示该隧道最近 500 条日志;当前日志增量追加,切换隧道时才进行一次有限量重绘。
- 可清理当前选中隧道的日志,不影响其他隧道或正在运行的 SSH 进程。
- SOCKS5 连接失败日志会显示请求的域名或 IP 及端口,并过滤用于关联目标的 OpenSSH 调试输出。
- 新建、编辑规则时可勾选“调试”,为该隧道输出完整的 OpenSSH DEBUG2 日志;该选项随规则持久化。
- 启动/停止按钮随所选隧道状态联动,禁止重复启动或停止。
- 可选私钥和 SSH 自定义端口。
- 启动时检查全部持久化规则,未运行的隧道会自动启动。
- JSON 配置原子写入、`fsync` 和双份备份,主配置损坏时自动恢复。
- 使用 `QProcess(program, arguments)`,不经过 shell。
- 应用图标内嵌到程序中,支持 Linux、macOS 和 Windows 多 DPI 显示;Windows
可执行文件同时携带 PE 图标资源。
## 分层
```text
main.php / app/
TypePHP:业务规则、CRUD、持久化、SSH argv、状态机
php-src/qt_tunnel.stub.php
原生函数声明
cpp-src/qt_tunnel.cc
Qt Widgets、对话框、事件队列、QProcess
```
C++ 层不会拼接 SSH 命令,也不会读写配置文件。对话框提交的数据以事件返回给
TypePHP,经过验证后才会写入仓库。
## 依赖
- TypePHP 编译器及其 PHP 8.4/Phpx 构建环境
- Qt 6 Widgets 开发包
- OpenSSH 客户端(运行时需要 `ssh` 位于 `PATH`
Ubuntu/Debian:
```bash
sudo apt install qt6-base-dev openssh-client
```
## 构建
项目默认使用 Debian/Ubuntu 的 Qt 6 系统路径:
```bash
php ../../bin/tpc.php project.yml --debug -o ssh_tunnel_manager
./ssh_tunnel_manager
```
Qt 安装在其他目录时,运行下面的命令获取参数,并相应调整 `project.yml`
```bash
pkg-config --cflags --libs Qt6Widgets
```
Windows 使用 Qt 6 MSVC SDK 时,将 `cxx-flags` 改为 Qt 的 `include`
`include/QtCore`、`include/QtGui`、`include/QtWidgets`,将 `ld-flags` 改为
`Qt6Widgets.lib`、`Qt6Gui.lib`、`Qt6Core.lib`。部署时执行:
```powershell
windeployqt ssh_tunnel_manager.exe
```
Windows 10/11 可在“可选功能”中安装 OpenSSH Client。
## 配置文件
- Linux/macOS:`$XDG_CONFIG_HOME/typephp/ssh-tunnel-manager.json`,未设置时使用
`~/.config/typephp/ssh-tunnel-manager.json`
- Windows:`%APPDATA%\TypePHP\ssh-tunnel-manager.json`
- 测试或便携运行:通过 `TYPEPHP_SSH_TUNNEL_CONFIG` 指定完整路径
同目录下的 `.bak` 文件是完整镜像备份。读取主配置失败时,应用会验证备份并
自动恢复主文件。所有成功保存的规则都会在下一次启动时自动建立,不再提供
容易造成遗漏的单条“自动启动”开关。
配置中不保存密码。推荐使用 SSH 私钥和 `ssh-agent`;应用为避免弹出不可见的
终端密码提示,固定启用 `BatchMode=yes`
远程转发是否能监听非回环地址由服务器的 `sshd_config``GatewayPorts`
设置决定;本工具不会绕过服务器安全策略。
## 业务层测试
该测试不依赖 Qt,可以直接用 PHP 执行:
```bash
php tests/domain_test.php
php tests/startup_test.php
```