Как сравнить две даты в скрипте, чтобы проверить срок действия

Как сравнить две даты в скрипте, чтобы проверить срок действия

Я создаю скрипт, с помощью которого я могу проверить, не истек ли срок действия какого-либо объекта, например, кэша билетов 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)

Я хочу узнать, истек ли срок действия билета Kerberos в операторе if, у меня возникли проблемы с логикой в ​​операторе 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", как предложил Камил, либо сравнить их с помощью арифметического расширения bash (которое вы можете использовать в сочетании с if, как указано в man bash, строка 270). Предполагая, что вы правильно проанализировали вывод команды klist, вы можете сделать одно из следующих:

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

Связанный контент