スクリプトで 2 つの日付を比較して有効期限を確認する方法

スクリプトで 2 つの日付を比較して有効期限を確認する方法

Kerberos チケット キャッシュなどの有効期限が切れていないかどうかを確認できるスクリプトを作成しています。

有効期限の日付/時刻を取得し、現在の日付/時刻を取得し、それらを比較して、この最初の日付/時刻が期限切れになるかどうかを確認する必要があります。

Kerberos チケットがまだ有効か、期限切れかを確認するためのスクリプトを作成しています。

両方の有効期限と時刻をエポック形式で取得できます (これが最適であると仮定)。

KRBEXPDATE=$(klist | grep -i krbtgt | awk '{print $3}')
KRBEXPTIME=$(klist | grep -i krbtgt | awk '{print $4}')
CURREPOCH=$(date +%s)
KRBEXPEPOCH=$(date --date="$KRBEXPDATE $KRBEXPTIME" +%s)

if ステートメントで Kerberos チケットの有効期限が切れているかどうかを確認したいのですが、時間を扱う if ステートメントのロジックに問題があります。ここで自分の質問に答えたかもしれませんが、CURRENTEPOCH が KRBEXPEPOCH より大きい場合は、「チケットは無効です」とエコーするべきでしょうか。これで意味がわかりますか?

if [[ "$CURREPOCH" > "$KRBEXPEPOCH" ]] ;
then
  echo "Ticket is not valid"
fi

答え1

現在の日付と有効期限を比較して、エポックからの秒数は、チケットの有効期限が切れているかどうかを確認するのに十分な方法です。 とCURREPOCHKRBEXPEPOCH同じホストから取得している限り、チケットの現在の状態をかなり正確に知ることができます (同じホストから取得していない場合は、取得された日付が異なるタイムゾーンに関連している場合があり、それに応じて日付をシフトする必要があることに注意してください)。

しかし、Kamil がコメントで述べたように、回答で使用した実装には重大な問題があります。 のman bash1753 行目にあるように、">" 演算子は文字列を比較します。これは、アプリケーションでは一般的に間違った動作です。理由を理解するには、次の操作を試してください。

if [[ "1000" > "200" ]]; then
  echo "Statement is true"
else
  echo "Statement is false"
fi

1000 という数値は実際には 200 より大きいため、「Statement is true」と出力されると予想されますが、実際には「Statement is false」と出力されます。これは、「>」が strcmp() のように動作し、文字列の ASCII コードを文字ごとに比較するためです (例: はa < btrue になります)。

やりたいことは、Kamil が提案したように「-gt」演算子を使用するか、bash の算術展開 ( の270 行if目のようにと組み合わせて使用​​できますman bash) を使用して比較することです。klist コマンドの出力を正しく解析したと仮定すると、次のいずれかを実行できます。

if [[ "$CURREPOCH" -gt "$KRBEXPEPOCH" ]]; then echo "expired"; fi
if (( $CURREPOCH > $KRBEXPEPOCH )); then echo "expired"; fi

関連情報