排查Bash脚本中cURL返回000错误码及提取错误码方法
如何排查curl返回000状态码的具体原因并提取错误码
你已经找对方向了!当curl返回000状态码时,说明请求根本没完成HTTP握手,这时候curl的退出状态码(就是你用$?拿到的数值)才是定位问题的关键——比如6对应无法解析主机,7是连接被拒,28是超时等等。
下面是具体的实现方法,帮你把错误码提取到变量里,还能直接解析出问题原因:
1. 单独提取curl退出码
你不需要把错误信息和退出码混在一起存,直接执行curl后用$?获取即可,记得把输出重定向避免干扰:
# 执行curl,静默模式+丢弃标准输出 curl -Ss "$link" > /dev/null # 把退出码存到变量里 fail_code=$? # 打印结果看看 echo "curl退出码:$fail_code"
这里的-Ss参数是:-S让curl只显示错误信息(不显示进度条),-s开启静默模式;> /dev/null把正常输出丢掉,只关注命令执行的结果状态。
2. 整合到你的链接检查流程里
可以把「检查HTTP状态码」和「获取错误码」结合起来,当状态码是000时再深入排查:
link="http://deadlink/" # 第一步:获取HTTP状态码 http_code=$(curl -Lo /dev/null --silent --head --write-out '%{http_code}' "$link") if [ "$http_code" = "000" ]; then # 状态码异常,重新执行curl获取退出码(不用--head,模拟真实请求场景) curl -Ss "$link" > /dev/null fail_code=$? echo "⚠️ 链接异常,HTTP状态码:$http_code,curl错误码:$fail_code" # 第二步:根据错误码解析具体原因 case $fail_code in 6) echo "原因:无法解析主机,请检查域名是否正确或DNS配置" ;; 7) echo "原因:连接被拒绝,目标服务器可能未启动/端口未开放/防火墙拦截" ;; 28) echo "原因:请求超时,网络不稳定或服务器无响应" ;; 35) echo "原因:SSL/TLS握手失败,证书无效/协议不兼容" ;; 52) echo "原因:服务器返回空响应" ;; *) echo "原因:未知错误,可查看curl手册(man curl)里的EXIT CODES章节" ;; esac else echo "✅ 链接正常,HTTP状态码:$http_code" fi
小提示
- 一定要给
$link加双引号"$link",避免链接里有特殊字符(比如&、空格)导致命令执行出错。 - 为什么要重新执行curl?因为
--head是发送HEAD请求,有些服务器对HEAD请求的处理和GET/POST不同,重新执行不带--head的curl能更准确模拟真实请求的错误场景。
内容的提问来源于stack exchange,提问作者algalg




