检查日期是否在下周内

检查日期是否在下周内

尝试创建一个使用 LetsEncrypt 自动续订 SSL 的脚本。

每日脚本首先检查 SSL 到期时间:

response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"

$responsenotAfter=May 9 19:27:44 2018 GMT

我想将它与今天的日期进行比较,并检查时差是否小于或等于 7 天。伪代码:

if [$response is less than 7 days away from today] then cd ~/letsencrypt $$ ~/dehydrated/dehydrated --cron --domain www.mydomain.com --out . --challenge http-01

我该怎么做呢?

我尝试$response通过转换为更可行的格式,date -d但出现date: extra operand ‘19:27:44’错误。

答案1

我将解决您实际关心的问题,而不是您提出的具体问题:dehydrated --cron已经为您检查了日期。

文档:

--cron( -c) 签署/续订不存在/更改/过期的证书。

代码:

# Check expire date of existing certificate
if [[ -e "${cert}" ]]; then
  echo " + Checking expire date of existing cert..."
  valid="$("${OPENSSL}" x509 -enddate -noout -in "${cert}" | cut -d= -f2- )"

  printf " + Valid till %s " "${valid}"
  if "${OPENSSL}" x509 -checkend $((RENEW_DAYS * 86400)) -noout -in "${cert}"; then
    printf "(Longer than %d days). " "${RENEW_DAYS}"
    if [[ "${force_renew}" = "yes" ]]; then
      echo "Ignoring because renew was forced!"
    else
      # Certificate-Names unchanged and cert is still valid
      echo "Skipping renew!"

https://github.com/lukas2511/de一线/blob/master/de一线#L1234-L1253

RENEW_DAYS似乎默认为 30,但您可以使用配置文件覆盖它;引用文档:

deHydrated 正在几个不同的地方寻找配置文件,它将使用按以下顺序找到的第一个配置文件:

  • /etc/dehydrated/config
  • /usr/local/etc/dehydrated/config
  • shell 的当前工作目录
  • 运行脱水的目录

那里的示例配置文件包含这一行:

# Minimum days before expiration to automatically renew certificate (default: 30)
#RENEW_DAYS="30"

例如,要将值从默认的 30 天降低到 7 天,您可以将第二行编辑为:

RENEW_DAYS="7"

答案2

现在确定到期日期为 1970 年 1 月 1 日的秒数,并将差值除以一天的秒数。

$ TZ=GMT date -d "May 9 19:27:44 2018 GMT" '+%s'
1525894064
$ TZ=GMT date '+%s'                             
1518192447
$ expr \( 1525894064 - 1518192447 \) / 86400
89

答案3

下面的命令将检查 openssl 命令提供的日期与“7 天后”的日期;如果 openssl 日期(自纪元以来的秒数)距离现在不到 7 天(自纪元以来的秒数),该if命令将成功,您可以执行您需要执行的操作:

response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"
responsetime=${response##notAfter=}
responsetz={$responsetime##* }
if [ $(date -d "$responsetime" +%s) -lt $(TZ=$responsetz date -d "now + 7 days" +%s) ]
then
   ## do the needful
fi

第一个赋值(在获得 $response 之后)去掉了前导的“notAfter=”文本。第二个任务捕获响应的时区;如果始终是格林威治标准时间,这可以简化。

这两个日期命令询问 (GNU) date 自 openssl 日期和“现在 + 7 天”的纪元以来的时间(以秒为单位),请小心地将第二次调用的时区设置为 openssl 命令报告的时区。

相关内容