Bash脚本执行curl检测SSL时异常退出问题求助
解决脚本执行curl时无故退出的问题
我猜你的脚本大概率开启了set -e选项(或者继承了这个设置)——这个选项会让脚本在任何命令返回非零退出码时直接终止执行。而curl遇到SSL证书问题时(比如自签名证书),返回的退出码是60,属于非零值,所以触发了脚本自动退出。
这里有几个可行的解决方案,你可以根据需求选择:
方案1:让curl命令强制返回成功状态
如果你只关心是否能匹配到SSL错误字符串,不需要保留curl的原始退出码,可以在命令末尾加上|| true,让这条命令无论如何都返回0,避免脚本退出:
SSL_STATUS=$( curl https://${DOMAIN} 2>&1 | grep "SSL certificate problem" || true )
或者如果脚本里有set -e,也可以临时关闭它再恢复:
# 临时关闭set -e set +e SSL_STATUS=$( curl https://${DOMAIN} 2>&1 | grep "SSL certificate problem" ) # 恢复set -e set -e
方案2:保留curl退出码,同时不终止脚本
如果你需要后续根据curl的实际状态做判断,可以先捕获curl的退出码,再处理输出:
# 先捕获curl的全部输出 RAW_OUTPUT=$(curl https://${DOMAIN} 2>&1) # 保存curl的退出码 CURL_EXIT=$? # 再从输出中匹配SSL错误 SSL_STATUS=$(echo "${RAW_OUTPUT}" | grep "SSL certificate problem") # 后续可以结合退出码和匹配结果判断 if [[ ${CURL_EXIT} -eq 60 && -n ${SSL_STATUS} ]]; then echo "检测到SSL证书问题:${SSL_STATUS}" elif [[ ${CURL_EXIT} -ne 0 ]]; then echo "curl执行失败,但不是SSL证书问题" else echo "SSL证书正常" fi
方案3:更可靠的SSL证书检测方式
其实不用依赖curl的输出文本,我们可以用更直接的工具来检测SSL证书状态,比如openssl s_client,它专门用于SSL连接检测,输出也更稳定:
# 检测是否是自签名证书 if openssl s_client -connect "${DOMAIN}:443" -servername "${DOMAIN}" < /dev/null 2>&1 | grep -q "self signed certificate"; then echo "发现自签名SSL证书问题" fi
这种方式不需要担心curl的退出码导致脚本退出,而且能更精准地定位证书类型问题。
内容的提问来源于stack exchange,提问作者Snakelegs
相关产品推荐
相关产品推荐

