我正在创建一个脚本,我可以在其中检查某些内容是否已过期,例如 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)
Run Code Online (Sandbox Code Playgroud)
我想看看 kerberos 票证是否在 if 语句中过期,我在处理时间的 if 语句上的逻辑有问题。我可能已经在这里回答了我自己的问题,但如果 CURRENTEPOCH 大于 KRBEXPEPOCH,则回显“票无效”。这有意义吗?
if [[ "$CURREPOCH" > "$KRBEXPEPOCH" ]] ;
then
echo "Ticket is not valid"
fi
Run Code Online (Sandbox Code Playgroud)
比较当前日期和到期日期,通过将它们转换为epoch 的秒数,是判断您的票是否已过期的一种很好的方法。只要你获得CURREPOCH和KRBEXPEPOCH来自同一个主机,你将能够以良好的精度告诉车票的当前状态(如果不从同一主机得到他们,记住,所获得的日期可能是相对于不同时区,您需要相应地改变它们)。
但是,正如 Kamil 在他的评论中提到的,您在答案中使用的实现有一个关键问题:正如您在man bash第 1753 行中看到的,“>”运算符比较字符串。对于您的应用程序,这通常是错误的做法。要了解原因,请尝试以下操作:
if [[ "1000" > "200" ]]; then
echo "Statement is true"
else
echo "Statement is false"
fi
Run Code Online (Sandbox Code Playgroud)
由于数字 1000 实际上大于 200,您可能希望打印出“Statement is true”……但您得到的是“Statement is false”。那是因为 ">" 的作用类似于 strcmp(),逐个字符地比较字符串上的 ASCII 代码(例如a < b,为真)。
您想要做的是使用“-gt”运算符,如 Kamil 建议的那样,或者使用 bash 的算术扩展(您可以结合使用if,按照man bash第 270 行)来比较它们。假设您正确解析了 klist 命令的输出,您可以执行以下任一操作:
if [[ "$CURREPOCH" -gt "$KRBEXPEPOCH" ]]; then echo "expired"; fi
if (( $CURREPOCH > $KRBEXPEPOCH )); then echo "expired"; fi
Run Code Online (Sandbox Code Playgroud)