You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

排查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

火山引擎 最新活动