
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 CURREPOCH
e KRBEXPEPOCH
do 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 bash
linha 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 < b
seria 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 bash
linha 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