web-dev-qa-db-ja.com

日付が来週以内かどうかを確認する

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

どうすればこれを行うことができますか?

$responsedate -dを介してより実用的な形式に変換しようとしましたが、date: extra operand ‘19:27:44’エラーが発生しました。

1
DDiran

私はあなたが尋ねた特定の質問ではなく、あなたの実際の懸念に対処します: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/dehydrated/blob/master/dehydrated#L1234-L125

RENEW_DAYSはデフォルトで30に見えますが、構成ファイルを使用してオーバーライドできます。引用 ドキュメント

dehydratedは、いくつかの異なる場所で構成ファイルを探しています。最初に見つけたものをこの順序で使用します。

  • /etc/dehydrated/config
  • /usr/local/etc/dehydrated/config
  • シェルの現在の作業ディレクトリ
  • 脱水が実行されたディレクトリ

そこにあるサンプル設定ファイルには、次の行が含まれています。

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

たとえば、値をデフォルトの30日から7日に下げるには、2行目を次のように編集します。

RENEW_DAYS="7"
2
dhag

今のところ、有効期限の1970年1月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
1
Gerard H. Pille

以下のコマンドは、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 =」テキストを取り除きます。 2番目の割り当ては、応答のタイムゾーンをキャプチャします。常にGMTの場合、これは単純化できます。

2つのdateコマンドは、openssl日付と「now + 7days」のエポックからの秒数を(GNU)dateに要求します。ただし、opensslコマンドによって報告されたタイムゾーンへの2回目の呼び出しのタイムゾーンを慎重に設定します。

1
Jeff Schaller