Skip to content

fix(rotate-secret): 修复 tr/head 管道 SIGPIPE 导致 rotate-secret.sh 静默退出 - #14

Open
Davidasx wants to merge 1 commit into
Yu9191:mainfrom
Davidasx:fix/rotate-secret-sigpipe
Open

fix(rotate-secret): 修复 tr/head 管道 SIGPIPE 导致 rotate-secret.sh 静默退出#14
Davidasx wants to merge 1 commit into
Yu9191:mainfrom
Davidasx:fix/rotate-secret-sigpipe

Conversation

@Davidasx

@Davidasx Davidasx commented Aug 4, 2026

Copy link
Copy Markdown

问题

运行 npm run rotate-secret:sh(即 bash scripts/rotate-secret.sh)时,脚本没有任何输出就直接退出,secret 不会被更新:

$ bash scripts/rotate-secret.sh; echo "退出码: $?"
退出码: 141

退出码 141 = 128 + 13,即进程被 SIGPIPE 终止。

原因

问题在 scripts/rotate-secret.sh 生成随机串这一行:

RAND_RAW="$(LC_ALL=C tr -dc 'A-Za-z0-9' </dev/urandom | head -c "$LENGTH")"
  1. head -c "$LENGTH" 读满指定字节数后立即关闭管道并退出;
  2. tr 面对 /dev/urandom 这个无限流仍在继续写入,于是被 SIGPIPE 杀掉,退出码 141;
  3. 脚本第 11 行的 set -euo pipefail 中,pipefail 使整条管道的退出码取自失败的 tr(141),-e 随即终止整个脚本。

由于这一行位于第一条 echo 之前,用户看到的现象就是「什么都没输出直接退出」,很难定位。

修复

先用 head/dev/urandom 读取有限字节,再交给 tr 过滤 —— 这样 tr 的输入自然结束,不会再写入已关闭的管道。因为过滤会丢弃非字母数字字符,外层用循环累积直到长度满足要求,再截取到目标长度:

RAND_RAW=""
while [[ ${#RAND_RAW} -lt "$LENGTH" ]]; do
    RAND_RAW+="$(head -c 256 /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9')"
done
RAND_RAW="${RAND_RAW:0:LENGTH}"

验证

修复后单独验证生成逻辑(在 set -euo pipefail 下):

生成: ARSUkWBBdr190eCeW4fJ2bB2ndZO0Zly (长度 32)
退出码: 0

长度正确、字符集仍为 URL-safe 的 [A-Za-z0-9],退出码 0。-l/--length 自定义长度的行为不变。

备注

  • 环境:Linux (GNU coreutils) / bash,trhead 的这一竞争在 GNU coreutils 下几乎必然触发。
  • 仅改动随机串生成方式,脚本其余逻辑(剪贴板复制、wrangler secret put 调用、结尾提示)均未改动。
  • scripts/rotate-secret.ps1(Windows 版)为独立实现,不受此问题影响,本 PR 未涉及。

🤖 Generated with Claude Code

`tr -dc 'A-Za-z0-9' </dev/urandom | head -c "$LENGTH"` 中,head 读满
指定字节后即关闭管道退出,而 tr 面对 /dev/urandom 的无限流仍在继续写入,
因而被 SIGPIPE 终止,退出码 141。脚本开头设置了 set -o pipefail,整条管道
的退出码取自失败的 tr,再叠加 set -e,脚本便在第一条 echo 之前就终止。

表现为运行 `bash scripts/rotate-secret.sh` 没有任何输出直接退出,
退出码 141,secret 也不会被更新。

改为先用 head 从 /dev/urandom 读取有限字节再交给 tr 过滤,使 tr 的输入
自然结束、不再写入已关闭的管道;外层循环累积直到满足长度要求,以补偿
过滤非字母数字字符造成的损耗。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 4, 2026 06:12

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

该 PR 修复了 scripts/rotate-secret.shset -euo pipefail 下因 tr | head 管道触发 SIGPIPE(退出码 141)而导致脚本在输出任何提示前静默退出的问题,从而确保 npm run rotate-secret:sh 能稳定生成并更新 Cloudflare Worker Secret。

Changes:

  • 将随机串生成逻辑从 tr ... </dev/urandom | head -c ... 改为先 head 截断输入、再 tr 过滤的方式,避免 SIGPIPE
  • 通过循环累积过滤结果,保证最终输出长度满足 --length 指定值,并在最后截取到目标长度。

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants