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

0

Estou criando um script em que posso verificar se algo está vencido, como um cache de tickets do kerberos.

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

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

Eu posso obter a data de vencimento + hora para 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)

Eu quero ver se o ticket do kerberos está expirado em uma instrução if, estou tendo problemas com a lógica da instrução if trabalhando com o tempo. Eu posso ter respondido minha própria pergunta aqui, mas deve ser CURRENTEPOCH é maior que KRBEXPEPOCH então echo "ticket não é válido". Isso faz sentido?

if [[ "$CURREPOCH" > "$KRBEXPEPOCH" ]] ;
then
  echo "Ticket is not valid"
fi
    
por brusso 16.12.2016 / 05:33

1 resposta

5

A comparação entre a data atual e a data de expiração, convertendo-as para segundos da época , é uma maneira boa de informar se o seu ticket expirou ou não. Contanto que você esteja obtendo CURREPOCH e KRBEXPEPOCH do mesmo host, você será capaz de dizer com boa precisão o estado atual do ticket (se você não os obtiver do mesmo host, lembre-se de que as datas obtidos podem ser relativos a diferentes fusos horários, e você precisaria mudá-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 em man bash , linha 1753, o ">" operador compara strings. 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 é, na verdade, maior que 200, você pode esperar que "Statement is true" seja impresso ... mas, em vez disso, você recebe "Statement is false". Isso é porque ">" age como um strcmp (), comparando caractere por caractere os códigos ASCII na string (por exemplo, a < b seria verdadeiro).

O que você quer fazer é usar o operador "-gt", como Kamil sugeriu, ou compará-los usando a expansão aritmética de bash (que você pode usar em combinação com if , conforme man bash , linha 270) . Supondo que você tenha analisado 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
    
por 16.12.2016 / 10:50