@zhangjianye 这个主要找你看 —— db-utils 在 Windows 上的兼容问题(0.7.37 的几处 shell 调用在 Windows 不可用),修复我已经提在 PR #8,等你 review + rebase 合并。
环境
- Windows 11 + Git Bash (MINGW64) + Node
- dev-skills 0.7.37(origin/main HEAD
25c1e1d)
- 影响所有走
db-utils 的 CLI:optima-grant-subscription / optima-grant-balance / optima-query-db 等
现象:0.7.37 在 Windows 上跑这些命令会连环踩三个坑
1. Infisical 认证第一步就崩
bin/helpers/db-utils.ts:45-46 用 execSync 拼 shell 字符串,JSON body 用单引号:
const response = execSync(
`curl -s -X POST "${config.url}/.../login" -H "Content-Type: application/json" -d '{"clientId": "${config.clientId}", "clientSecret": "${config.clientSecret}"}'`,
{ encoding: 'utf-8' }
);
Windows cmd.exe 里单引号是字面字符、不是字符串定界符,JSON body 被空格拆碎 → curl 发出畸形请求 → 拿不到 token → 命令直接报错退出。实跑报错(已脱敏):
❌ Error: Command failed: curl -s -X POST "https://secrets.optima.onl/api/v1/auth/universal-auth/login" -H "Content-Type: application/json" -d '{"clientId": "<REDACTED>", "clientSecret": "<REDACTED>"}'
2. ⚠️ 多行 SQL 静默 no-op(更危险:报成功、实际没写库)
bin/helpers/db-utils.ts:130 用 psql -c "<sql>":
return execSync(`"${psql}" -h ${conn.host} ... -c "${sql.replace(/"/g, '\\"')}"`, ...)
grant/topup 的 SQL 是多语句事务(BEGIN; INSERT...; UPDATE...; COMMIT;)。Windows cmd.exe 会截断 -c 引号内的换行,只执行第一行 BEGIN; 就退出,且 exit code 0 → 调用方以为充值/开通成功,实际数据库纹丝不动。
本 session 早先真踩到了:一笔 $20 充值 CLI 打印"✓ Done",但 DB 余额没变,排查后定位到这里。这个比 #1 更隐蔽,因为它不报错。
3. findPsqlPath 没有 win32 分支
which psql 在 Git Bash 下返回 MSYS 路径(/c/Program Files/...),Node 的 execSync(走 cmd.exe)无法解析 → 找不到 psql。
修复(PR #8,待 review/合并)
分支 fix/show-env-windows-shell-quoting → #8 已修这三点:
- Infisical/curl 改用
execFileSync + 数组传参(绕过 shell,跨平台安全)
queryDB 改用临时文件 + psql -f + -v ON_ERROR_STOP=1(多语句事务不再截断,任一语句失败即非零退出)
findPsqlPath 增加 win32 分支(探测 C:\Program Files\PostgreSQL\*\bin\psql.exe,回退 where psql)
⚠️ 需要先 rebase:PR #8 基于 0.7.32 拉的,而 main 在 0.7.37 用 4e0589b 独立重写了 setupSSHTunnel(僵尸隧道检测 pg_isready+kill)。两边改的是不同关注点、业务逻辑不冲突,但 PR #8 要先 rebase 到当前 main 再合,别把僵尸隧道那段冲掉。
附:一个独立的基础设施问题(@xbfool,非本包 bug)
我这台 Windows 机器当前连不上 bastion 3.0.210.113:TCP 能连到 22,但服务端在 kex 阶段、回 SSH banner 之前就关连接:
kex_exchange_identification: Connection closed by remote host
Connection closed by 3.0.210.113 port 22
裸 ssh ec2-user@3.0.210.113(完全不经过 dev-skills)同样复现,所以与包版本无关。推测是本 session 早先短时间开关大量隧道,触发了 bastion sshd 的 PerSourcePenalties / fail2ban,把我的出口 IP 临时惩罚了(团队其他成员 IP 正常,所以你们那边能连)。麻烦在 bastion 上看一眼 sshd 的 PerSourcePenalties / fail2ban 配置和我这个出口 IP 的封禁状态。
@zhangjianye 这个主要找你看 —— db-utils 在 Windows 上的兼容问题(0.7.37 的几处 shell 调用在 Windows 不可用),修复我已经提在 PR #8,等你 review + rebase 合并。
环境
25c1e1d)db-utils的 CLI:optima-grant-subscription/optima-grant-balance/optima-query-db等现象:0.7.37 在 Windows 上跑这些命令会连环踩三个坑
1. Infisical 认证第一步就崩
bin/helpers/db-utils.ts:45-46用execSync拼 shell 字符串,JSON body 用单引号:Windows
cmd.exe里单引号是字面字符、不是字符串定界符,JSON body 被空格拆碎 → curl 发出畸形请求 → 拿不到 token → 命令直接报错退出。实跑报错(已脱敏):2.⚠️ 多行 SQL 静默 no-op(更危险:报成功、实际没写库)
bin/helpers/db-utils.ts:130用psql -c "<sql>":grant/topup 的 SQL 是多语句事务(
BEGIN; INSERT...; UPDATE...; COMMIT;)。Windowscmd.exe会截断-c引号内的换行,只执行第一行BEGIN;就退出,且 exit code 0 → 调用方以为充值/开通成功,实际数据库纹丝不动。3.
findPsqlPath没有 win32 分支which psql在 Git Bash 下返回 MSYS 路径(/c/Program Files/...),Node 的execSync(走 cmd.exe)无法解析 → 找不到 psql。修复(PR #8,待 review/合并)
分支
fix/show-env-windows-shell-quoting→ #8 已修这三点:execFileSync+ 数组传参(绕过 shell,跨平台安全)queryDB改用临时文件 +psql -f+-v ON_ERROR_STOP=1(多语句事务不再截断,任一语句失败即非零退出)findPsqlPath增加 win32 分支(探测C:\Program Files\PostgreSQL\*\bin\psql.exe,回退where psql)4e0589b独立重写了setupSSHTunnel(僵尸隧道检测pg_isready+kill)。两边改的是不同关注点、业务逻辑不冲突,但 PR #8 要先 rebase 到当前 main 再合,别把僵尸隧道那段冲掉。附:一个独立的基础设施问题(@xbfool,非本包 bug)
我这台 Windows 机器当前连不上 bastion
3.0.210.113:TCP 能连到 22,但服务端在 kex 阶段、回 SSH banner 之前就关连接:裸
ssh ec2-user@3.0.210.113(完全不经过 dev-skills)同样复现,所以与包版本无关。推测是本 session 早先短时间开关大量隧道,触发了 bastion sshd 的PerSourcePenalties/ fail2ban,把我的出口 IP 临时惩罚了(团队其他成员 IP 正常,所以你们那边能连)。麻烦在 bastion 上看一眼 sshd 的PerSourcePenalties/ fail2ban 配置和我这个出口 IP 的封禁状态。