在解析输出之前评估OpenSSL的输出

时间:2018-01-05 16:12:16

标签: regex bash openssl xargs

使用以下代码检查SSL证书是否到期:

cat localdomains | xargs -L 1 bash -c 'openssl s_client -connect $0:443 -servername $0 2> /dev/null | openssl x509 -noout -enddate | cut -d = -f 2 | xargs -I {} echo {} $0'

当我遇到没有返回证书的域时,我试图围绕如何将输出更改为N / A,而不是尝试评估“cut -d = -f 2”然后xargs -I

1 个答案:

答案 0 :(得分:2)

如果您在变量中捕获命令的输出,则可以对其进行验证。假设这不是一个班轮:

#!/bin/bash
while read domain; do
  expiry=$(openssl s_client -connect ${domain}:443 -servername ${domain} 2>/dev/null </dev/null | \
    openssl x509 -noout -enddate 2>&1 | cut -d = -f 2)

  # validate output with date
  if date -d "${expiry}" > /dev/null 2>/dev/null ; then
    echo ${expiry} ${domain}
  else
    echo "N/A" ${domain}
  fi
done

请注意以下几点:

  1. 将/ dev / null重定向到openssl s_client的标准输入以获取提示(see here for technical details
  2. 将第二个openssl x509的stderr重定向到stdout,以便对其进行验证。
  3. 您可以使用grepsed来验证输出。我发现date很方便(如果你想用它来重新格式化日期,那就太方便了。)
  4. 我通过将其放入文件check_cert_expiry.sh

    来测试此解决方案
    $ cat localdomains 
    stackoverflow.com
    example.example
    google.com
    $ cat localdomains | ./check_cert_expiry.sh 
    Aug 14 12:00:00 2019 GMT stackoverflow.com
    N/A example.example
    Feb 21 09:37:00 2018 GMT google.com
    

    干杯!