Watch at Ease看见世界,读懂生活。

科技 · 实用指南

curl 报错 23?先证明是文件、管道还是封装器拒绝了输出

“Failure writing output to destination” 是本地写入失败,不等于服务器或网络失败。先保留命令和退出状态,再把文件目标与管道分开,只修真正拒绝字节的目标。

Original technical diagram separating curl exit 23 evidence into file, pipeline and wrapper checks.
原创插画:先隔离写入目标,再改权限或重装 curl。 Watch at Ease

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 状态、消费者状态、最终大小及发布方提供的校验和或签名,并清理可能被误认成功的半成品。

Original decision diagram for early-closing pipes, file destinations, wrappers and verification after curl error 23.
原创插画:提前结束的读取与完整下载失败需要不同的验收。 Watch at Ease