有効期限を確認するためにスクリプトで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 < b結果はtrue)。

あなたが望むのは、Kamilが提案したように「-gt」演算子を使用するか、bashの算術拡張(行if270man bashに従って結合することができます)を使用して比較することです。 klistコマンドの出力を正しく解析すると仮定すると、次のいずれかを実行できます。

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

おすすめ記事