如何为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
相关产品推荐
相关产品推荐

