网络手记

curl 显示 0 号退出码却是 404?分清传输成功与 HTTP 失败

用 curl 检查机场节点时,命令退出码是 0,却看到网页返回 404 或 500,并不矛盾。退出码回答“传输是否完成”,HTTP 状态码回答“服务器怎样处理请求”,必须同时记录。

两类状态分别代表什么

curl 默认把完整收到 HTTP 错误页面视为一次成功传输,因此即使服务器返回 404,命令也可能以 0 退出。curl 官方 FAQ 说明,可使用 --fail 让非成功 HTTP 响应导致错误;--fail-with-body 则在返回错误的同时保留响应正文,便于排查。

网络层失败则可能没有 HTTP 状态,例如 DNS 解析失败、连接超时或 TLS 校验失败。这时要看 curl 退出码和错误信息,而不是把状态码 000 当成服务器回复。

一条命令同时记录

对自己有权访问的固定测试页执行:

curl --silent --show-error --output response.txt \
  --write-out "http=%{http_code} exit=%{exitcode} time=%{time_total}\n" \
  https://example.com/test

如需让 HTTP 4xx、5xx进入失败分支,可加入:

--fail-with-body

不要只看屏幕最后一行。保留请求时间、HTTP 状态、curl 退出码以及少量脱敏错误信息;不要记录 Cookie、Authorization、订阅链接或完整响应中的个人数据。

用对照定位问题

  • exit=0 且 http=200:传输和服务器响应都完成,再检查正文是否正确。
  • exit=0 且 http=404/500:网络路径已经到达服务器,问题更接近 URL、目标服务或上游响应。
  • 非零退出码且 http=000:优先看 DNS、TCP、TLS 或代理连接阶段。
  • 换节点后状态码完全相同:不应把服务器业务响应误写成节点故障。

同一 URL 还应做直连、候选节点和另一网络对照。若只有某条路径无法建立连接,才继续检查节点或分流;若所有路径都收到同一个 4xx,应先核对请求本身。

验收方法

机场推荐测试报告应把“请求到达”“HTTP 处理成功”和“正文正确”分成三项。只有三项都满足,才能称为任务成功;这样可以避免把 404 当断网,也避免把退出码 0 当成页面可用。

来源:curl 官方 FAQ、curl 官方手册:--fail-with-body、--write-out 与退出码。

评论

搜索文章

正在加载搜索…