OpsFlash v0.4.1:修掉 SSH 非交互命令不结束、流式收尾死锁与 CMD 多行校验误伤
项目信息
- GitHub:https://github.com/LeapSunrise26/OpsFlash
- Gitee:https://gitee.com/LeapSunrise/OpsFlash
OpsFlash 是轻量级运维极速引擎(The Flash Engine for Micro-Ops),基于 Wails v3 + Go + Vue 3 的跨平台桌面运维工具。单二进制分发,本地 SQLite 存储,敏感凭据加密保护。
这一版主要动的是 SSH 执行链路,三个都是实际踩出来的坑。
修复一:非交互命令执行完不结束
现象是 SSH 非交互指令跑完之后一直不返回,界面卡在「运行中」。
原因在 PTY:命令衍生的后台进程仍然持有 PTY,这种情况下 sshd 不会发送 EOF,Wait() 就永久阻塞住了。
修法是改结束判定条件——不再只依赖 Wait() 返回,而是「Wait 返回 或 输出静默 10s」两者取先到者。后台进程占着 PTY 不放时,输出静默超时即可收尾。
修复二:流式收尾死锁
流式执行结束时会话无法关闭,读取协程永久阻塞。
根因是 x/crypto/ssh 不会关闭 stdout writer,读取协程读不到 EOF,就一直挂着,会话自然结束不了。
修法是在关闭会话时显式关闭输出管道,让读取协程能正常退出。交互式会话停止后读取协程残留的问题,也随着输出管道关闭一并修掉了。
修复三:CMD 多行校验误伤交互式与守护进程指令
之前启动 SSH 交互式 / 守护进程类型的指令时,会报「CMD 命令不支持整体多行脚本」。
这个校验本身是为整体多行脚本场景准备的,但作用域放得太宽。现在改为仅在本地 terminal 模式生效,SSH 交互式与守护进程模式不再被拦截。
新增:SSH 远程守护进程
新增 SSH 远程守护进程(后台类型指令),支持通过 SSH 连接的守护进程类型指令。
实现方式:
nohup远程启动kill -0查活kill停止
其余能力速览
用户与认证:登录/登出,Token 会话(24h 过期),密码 bcrypt 哈希,用户管理。
连接管理:SSH / Redis / MySQL / TDengine 连接统一管理,密码、私钥、口令凭据本地加密存储,连接测试含往返延迟。
SSH 隧道:local / remote / dynamic 三种端口转发,一键启停、断线自动重连、应用启动自启、分组与批量创建。
指令库:命令统一管理(环境分组、terminal / SSH / Redis / MySQL / TDengine 五种执行位置、cmd / PowerShell / Bash 脚本解释器),非交互 / 交互终端 / 守护进程三种命令类型,ConPTY 实时输出、流式执行可停止。
数据库执行:Redis 指令(go-redis)、MySQL / TDengine SQL(taosAdapter REST 免 CGO)一键执行,查询结果以结构化表格展示。
脚本库:bat / ps1 / sh 脚本统一管理,Windows 走 WSL bash / Git Bash(自动探测路径挂载)。
桌面体验:系统托盘(关闭最小化)、每日日志文件。
技术栈
- 桌面框架:Wails v3(v3.0.0-beta.4)
- 后端:Go 1.25
- 前端:Vue 3 + TypeScript + Vite 8
- SSH:
golang.org/x/crypto/ssh(纯 Go,无 CGO) - Redis 客户端:
github.com/redis/go-redis/v9 - MySQL 驱动:
github.com/go-sql-driver/mysql - TDengine:通过 taosAdapter REST(纯 Go net/http,无 CGO)
- 存储:SQLite(
modernc.org/sqlite,纯 Go 驱动)
环境与构建
环境要求:Go 1.25+、Node.js 20+、Wails3 CLI。
- 开发模式:
wails3 dev热重载 - 构建:
wails3 build生成生产可执行文件到bin/
首次启动内置管理员账号 admin / 123456,登录后尽快修改。
项目结构
main.go:应用入口server/:Go 后端,含authservice.go、userservice.go、connections.go、opsruntime.go(命令执行运行时 PTY/会话),以及exec/(执行器 ssh/mysql/redis/taos/terminal)、pty/(PTY 抽象,Windows ConPTY / Unix creack/pty)、daemon/(守护进程,Windows Job Object 进程树管理)、secret/(凭据加密 DPAPI / AES-256-GCM)、tunnel/frontend/:Vue 3 前端docs/、build/
开源协议 MIT。