技术 · 实用指南
curl 错误 23:重试传输前先诊断输出消费者
错误 23 表示 curl 无法把已接收的数据写入本地目标。保留 stderr 与管道各阶段状态,确认消费者是文件、管道、终端还是回调,修复写入方,再以完整字节或可信摘要验收。

curl 退出码 23 是本地写入失败,不是网络路径的诊断。先保存 curl stderr 和管道各阶段状态,再确认实际输出消费者、复现其写入契约、修复该消费者,并以完整字节数或可信摘要验收。
1. 重试前保留首次失败
用不隐藏 stderr 的最小等价命令重现。直接写文件时记录命令、目标路径、curl 退出码和首个写入错误;管道中在结束后立刻保存 Bash PIPESTATUS,必要时启用 pipefail。
不要先加重试、丢弃 stderr 或改 TLS。错误 23 指向本地文件系统或类似目标的写入失败;重试不能创建缺失目录、释放空间、重开已关闭管道或修正回调返回值。
2. 找出拥有失败写入的消费者
若 -o 指向文件,检查精确路径的父目录、权限、剩余块与 inode、配额、挂载状态和命名空间。若 stdout 进入管道,下一个进程就是消费者;判断它是按设计提前退出、崩溃还是拒绝数据。终端与 libcurl 回调也各自是消费者。
写回调必须报告实际处理的全部字节。短返回或失败返回会以 CURLE_WRITE_ERROR 终止传输,因此请求字节、返回字节和应用错误都应进入事件记录。
3. 复现本地目标而非远端请求
用无害的已知输入单独测试消费者。本地 curl 8.5.0 测试中,写 /dev/full、缺失父目录以及向 head -c 1 输送完整流都让 curl 返回 23;完整流进入 sha256sum 时两端都返回零。
head 提前关闭在只需前缀时可能是有意行为,但必须标为部分读取。安装包、归档和数据导入要求完整文件,在消费者与完整性检查通过前不得把警告隐藏为成功。
4. 修复责任方并定义验收证据
修复已经证实的分支:建立正确目录与属主、释放或扩容文件系统、恢复可写挂载、修正下游程序、避免前缀消费者,或让回调持久处理并准确报告全部字节。
验收不只是没有报错。要求 curl 与所有必要消费者返回预期状态,确认目标位于正确命名空间,并在可用时核对长度、发布方摘要或签名;把原始 stderr、状态、目标身份与最终验证一起留存。
