我正在创建一个脚本,可以在其中检查某些内容是否过期,例如 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
比较当前日期和到期日期,将它们转换为从纪元开始的秒数,是判断您的机票是否过期的足够好方法。只要您从同一主机获取CURREPOCH
和KRBEXPEPOCH
,您就能够准确地判断票证的当前状态(如果您不是从同一主机获取它们,请注意,获取的日期可能与不同的日期相关)时区,您需要相应地改变它们)。
然而,正如卡米尔在他的评论中提到的,您在答案中使用的实现有一个关键问题:正如您在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 的算术扩展(您可以根据第if
270man bash
行与 结合使用)来比较它们。假设您正确解析了 klist 命令的输出,您可以执行以下任一操作:
if [[ "$CURREPOCH" -gt "$KRBEXPEPOCH" ]]; then echo "expired"; fi
if (( $CURREPOCH > $KRBEXPEPOCH )); then echo "expired"; fi