已在 瞎玩实验室 更新上线,或者前往 GitHub 查看本项目,本项目使用 Node.jsbash 完成

最近实在是太闲,就开始去翻各位大佬的博客看有没有啥可以学习的。刚好看到 Sukka 之前用 bash 和 curl 写了个检查 SSL 状态的小工具,能把结果以 JSON 的形式保存在本地供前端调用。

Sukka 将其开源在了 GitHub 上,我便赶忙 fork 了一份 clone 到本地学习一下。花了小半天时间搞懂了之后丢进 WSL(Ubuntu 18.04)中跑了一下,发现,这你不对劲啊,你咋还给我报错了呢!???

错误信息

date: invalid date ‘*  expire date: Feb 15 12:00:00 2021 GMT’
./runcheck.sh: line 49: [: <: unary operator expected

时间格式出错???嗯???

赶快打开生成的结果 nya.run.json 看看,发现,你这也不对劲啊,你这数据没给我处理啊!??你这咋回事啊!??

错误的 nya.run.json

{
"domain": "nya.run",
"subject": "* subject: CN=nya.run",
"start": "* start date: Feb 15 00:00:00 2020 GMT",
"expire": "* expire date: Feb 15 12:00:00 2021 GMT",
"issuer": "* issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=Encryption Everywhere DV TLS CA - G1",
"check": "2020-02-21 21:30:29",
"remain": "-18313",
"status": "Soon Expired",
"statuscolor": "warning"
}

搞快回去看对应的代码和原始数据 ca.info 找找看原因。哦,你这 sed -i 这里面套的正则表达式没给我写对啊。因为 Ubuntu 18.04 的种种不明所以的原因,\t 这个正则无法匹配,需将其改为 [\t]* 才能够匹配成功。

修改后的 bash

sed -i 's|\* [\t]* start date: ||g' ./tmp/${1}.info
sed -i 's|\* [\t]* expire date: ||g' ./tmp/${1}.info
sed -i 's|\* [\t]* issuer: ||g' ./tmp/${1}.info
sed -i 's|\* [\t]* SSL certificate verify ||g' ./tmp/${1}.info
sed -i 's|\* [\t]* subject: ||g' ./tmp/${1}.info

改好后,再跑一下试试。诶,没有报错,看了下生成的 nya.run.json ,内容正确,这你就对了嘛。

正确的 nya.run.json

{
"domain": "nya.run",
"subject": "CN=nya.run",
"start": "Feb 15 00:00:00 2020 GMT",
"expire": "Feb 15 12:00:00 2021 GMT",
"issuer": "C=US; O=DigiCert Inc; OU=www.digicert.com; CN=Encryption Everywhere DV TLS CA - G1",
"check": "2020-02-21 21:40:39",
"remain": "359",
"status": "Valid",
"statuscolor": "success"
}

但我后来将其丢进 CentOS 7 里跑的时候,却又发现了行新的问题,CentOS 7 中 sed 命令用的正则表达式的格式,他又不一样!!!而且 CentOS 7 的 curl 过于老旧,且无法将其更新到新版本,无法获取到 SSL certificate verify OK 这条信息,导致数据处理出错。我对其做了下适配,因为无法获得部分信息,只能使用默认值进行替代。

适配部分如下

# Aliyun CentOS 7
sed -i 's/\* \tstart date: //g' ./tmp/${1}.info
sed -i 's/\* \texpire date: //g' ./tmp/${1}.info
sed -i 's/\* \tissuer: //g' ./tmp/${1}.info
sed -i 's/\* \tSSL certificate verify //g' ./tmp/${1}.info
sed -i 's/\* \tsubject: //g' ./tmp/${1}.info

# Aliyun CentOS 7
if [ $expirestamp \< $nowstamp ]; then
    echo '"status": "Expired",' >> ./tmp/${1}.json
    echo '"statuscolor": "error"' >> ./tmp/${1}.json
elif [ $expireday \< 10 ]; then
    echo '"status": "Soon Expired",' >> ./tmp/${1}.json
    echo '"statuscolor": "warning"' >> ./tmp/${1}.json
else
    echo '"status": "Valid",' >> ./tmp/${1}.json
    echo '"statuscolor": "success"' >> ./tmp/${1}.json
fi

以上适配的部分均已在我的 GitHub 中写到,有需要的可以将删除其注释以供使用。

最后生成的 JSON 数据存储在 /results/domain.json 中,这个时候有需要的可以用前端页面进行展示,也是非常的方便的啦。

Q.E.D.