科技 · 实用指南
curl 报错 23?先证明是文件、管道还是封装器拒绝了输出
“Failure writing output to destination” 是本地写入失败,不等于服务器或网络失败。先保留命令和退出状态,再把文件目标与管道分开,只修真正拒绝字节的目标。

curl 退出码 23 表示已收到的数据无法写入本地文件,或写回调返回错误。它指出写入边界失败,却不说明原因:下游命令可能主动停止读取,路径可能不存在,文件系统可能已满,封装器也可能用了不同的临时目录。
不要先加 sudo、重装 curl 或隐藏 stderr。保存完整命令与管道两端状态,再用同一 URL 写入一个受控文件。这个分流会告诉你应检查文件目标还是管道右侧的消费者。
冻结命令并分类目标
保存完整命令,记录 curl --version、type -a curl、输出参数、重定向以及管道中的每个程序。脚本调用时还要保存工作目录。
在 Bash 中立即记录 ${PIPESTATUS[@]},避免最后一个命令的零状态掩盖 curl 23;先定义需要完整文件、完整流还是只需提前命中。
用一次受控文件写入做分流
同一 URL 改为 --output 写入你拥有目录中的新文件;保持必要的跳转和认证选项,但暂时移除 head、grep 与安装器。
受控文件成功时转查原消费者或封装器;失败时保存 23 前面的 warning,并先核路径。
审计真实文件目标
核输出父目录、该文件系统的块与 inode,并以同一用户创建一个小临时文件。不要拿其他目录的所有权推断这里可写。
嵌套 -o 路径只创建必要父目录;核符号链接、只读挂载、容器 bind mount 与沙箱范围,别先放宽权限。
审计管道或提前退出的读取者
head 与 grep -q 取得所需内容后会提前结束,内核随后向写端报告断管;curl 无法知道这是否是设计。部分读取若属预期,应显式处理两端状态并承认未保留完整正文。
若后续需要完整载荷,就先写临时文件、校验,再让消费者读取;不要掩盖 23 或让安装、校验步骤接受截断流。
检查封装器、窄修并验收
只有打包版或嵌入版失败时,比对实际 curl 可执行文件、约束与 /usr/bin/curl,并检查封装器的临时目录;别因他人 Snap 案例就直接卸载。
完成一个窄修后只重跑一次,核 curl 状态、消费者状态、最终大小及发布方提供的校验和或签名,并清理可能被误认成功的半成品。
