Como comparar duas datas no script para verificar a expiração

Como comparar duas datas no script para verificar a expiração

Estou criando um script onde posso verificar se algo expirou, como um cache de tickets Kerberos.

Preciso obter a data/hora de expiração, obter a data/hora atual e compará-las para ver se essa primeira data/hora expiraria.

Estou criando um script para ver se um ticket Kerberos ainda é válido ou expirou.

Posso obter a data e hora de expiração de ambos no formato de época (supondo que seja o melhor).

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)

Quero ver se o ticket Kerberos expirou em uma instrução if. Estou tendo problemas com a lógica da instrução if funcionando com o tempo. Posso ter respondido minha própria pergunta aqui, mas se CURRENTEPOCH for maior que KRBEXPEPOCH então echo "ticket is not valid". Isso faz sentido?

if [[ "$CURREPOCH" > "$KRBEXPEPOCH" ]] ;
then
  echo "Ticket is not valid"
fi

Responder1

Comparar a data atual e a data de vencimento, convertendo-as parasegundos da época, é uma maneira boa de saber se o seu tíquete expirou ou não. Desde que você obtenha CURREPOCHe KRBEXPEPOCHdo mesmo host, você poderá saber com boa precisão o estado atual do ticket (se você não os obtiver do mesmo host, lembre-se que as datas obtidas podem ser relativas a diferentes fusos horários e você precisaria alterá-los de acordo).

No entanto, como Kamil mencionou em seu comentário, a implementação que você usou em sua resposta tem um problema crucial: como você pode ver na man bashlinha 1753, o operador ">" compara strings. O que, para sua aplicação, geralmente é uma coisa errada a se fazer. Para entender o porquê, tente isto:

if [[ "1000" > "200" ]]; then
  echo "Statement is true"
else
  echo "Statement is false"
fi

Como o número 1000 é de fato maior que 200, você pode esperar que "A declaração é verdadeira" seja impressa... mas em vez disso você obtém "A declaração é falsa". Isso ocorre porque ">" atua como um strcmp(), comparando caractere por caractere os códigos ASCII na string (por exemplo, a < bseria verdadeiro).

O que você quer fazer é usar o operador "-gt", como sugeriu Kamil, ou compará-los usando a expansão aritmética do bash (que você pode usar em combinação com if, conforme man bashlinha 270). Supondo que você analisou a saída do comando klist corretamente, você pode fazer um destes:

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

informação relacionada