Skip to content

Windows 上 dev-skills 0.7.37 不可用:Infisical 认证失败 + 多行 SQL 静默 no-op(修复见 PR #8) #16

@Zhiying-Li-dot

Description

@Zhiying-Li-dot

@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-46execSync 拼 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:130psql -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 的封禁状态。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions