You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Shell脚本中的openssl命令添加超时与错误提示?

Shell脚本为openssl证书查询添加超时控制方案

直接使用Linux系统默认预装的timeout工具(属于GNU coreutils组件,无需额外安装)即可实现无额外依赖的超时控制,同时配套错误提示逻辑,修改后的完整可运行脚本如下:

#!/bin/bash
FILENAME=$1
# 超时阈值,单位为秒,可根据网络环境自行调整
QUERY_TIMEOUT=5

# 前置校验输入文件是否存在
if [[ ! -f "$FILENAME" ]]; then
    echo "错误:输入文件 $FILENAME 不存在,请检查路径"
    exit 1
fi

while read -r ip; do
    # 跳过CSV解析产生的空行
    [[ -z "$ip" ]] && continue
    echo "===== 正在查询IP:$ip ====="
    # 用timeout包裹整条查询管道,统一捕获输出和退出状态
    query_result=$(timeout $QUERY_TIMEOUT bash -c "echo -n | openssl s_client -connect '${ip}:443' -showcerts 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | openssl x509 -noout -dates 2>&1")
    exit_code=$?

    if [[ $exit_code -eq 124 ]]; then
        echo "*错误:连接 $ip 超时,${QUERY_TIMEOUT}秒内未得到响应*"
    elif [[ $exit_code -ne 0 || -z "$query_result" ]]; then
        echo "*错误:查询 $ip 证书失败,可能是443端口未开放、服务未启动或连接被拒绝*"
    else
        echo "$query_result"
    fi
    echo ""
done < <(cut -d "," -f2 "$FILENAME" | tail -n +2)

实现关键点说明

  • timeout命令在命令执行超时时会固定返回状态码124,通过判断该状态码即可精准识别超时场景,输出对应提示
  • 必须将整条openssl查询管道包裹在bash -c子shell中交给timeout管控,否则timeout仅能终止第一个openssl进程,后续的sed、证书解析进程会残留为孤儿进程
  • 原脚本将openssl的错误输出全部重定向到/dev/null,出现问题无法排查,修改后统一捕获错误输出,非超时类的连接异常也会给出明确提示
  • 新增了输入文件合法性校验、空行跳过逻辑,避免批量执行时因为输入格式异常中断
  • 所有变量引用都添加了双引号包裹,避免IP或文件名包含特殊字符时出现执行错误

内容的提问来源于stack exchange,提问作者awslearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:09:23