编程 OpsFlash v0.4.1:修掉 SSH 非交互命令不结束、流式收尾死锁与 CMD 多行校验误伤

2026-10-06 20:02:27

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。

复制全文 生成海报 Go SSH 运维工具 Wails Vue3

推荐文章

程序员茄子在线接单