如何比较脚本中的两个日期以检查过期时间

如何比较脚本中的两个日期以检查过期时间

我正在创建一个脚本,可以在其中检查某些内容是否过期,例如 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,您就能够准确地判断票证的当前状态(如果您不是从同一主机获取它们,请注意,获取的日期可能与不同的日期相关)时区,您需要相应地改变它们)。

然而,正如卡米尔在他的评论中提到的,您在答案中使用的实现有一个关键问题:正如您在man bash第 1753 行中看到的,“>”运算符比较字符串。对于您的应用程序来说,这通常是错误的做法。要了解原因,请尝试以下操作:

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)。

您想要做的是使用“-gt”运算符,就像 Kamil 建议的那样,或者使用 bash 的算术扩展(您可以根据第if270man bash行与 结合使用)来比较它们。假设您正确解析了 klist 命令的输出,您可以执行以下任一操作:

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

相关内容