Cómo comparar dos fechas en script para verificar el vencimiento

Cómo comparar dos fechas en script para verificar el vencimiento

Estoy creando una secuencia de comandos donde puedo verificar si algo ha caducado, como un caché de tickets de Kerberos.

Necesito obtener la fecha/hora de vencimiento, obtener la fecha/hora actual y compararlas para ver si esta primera fecha/hora estaría vencida.

Estoy creando una secuencia de comandos para ver si un ticket de Kerberos todavía es válido o ha caducado.

Puedo obtener la fecha de vencimiento y la hora para ambos en formato de época (suponiendo que sea lo mejor).

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)

Quiero ver si el ticket de Kerberos ha caducado en una declaración if. Tengo problemas con la lógica de la declaración if que funciona con el tiempo. Es posible que haya respondido mi propia pregunta aquí, pero si CURRENTEPOCH es mayor que KRBEXPEPOCH, entonces responda "el boleto no es válido". ¿Esto tiene sentido?

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

Respuesta1

Comparar la fecha actual y la fecha de vencimiento, convirtiéndolas asegundos de la época, es una forma bastante buena de saber si su billete ha caducado o no. Siempre que los obtenga CURREPOCHdel KRBEXPEPOCHmismo host, podrá saber con buena precisión el estado actual del billete (si no los obtiene del mismo host, tenga en cuenta que las fechas obtenidas pueden ser relativas a diferentes zonas horarias y deberá cambiarlas en consecuencia).

Sin embargo, como Kamil mencionó en su comentario, la implementación que utilizó en su respuesta tiene un problema crucial: como puede ver en man bashla línea 1753, el operador ">" compara cadenas. Lo cual, para su aplicación, generalmente es algo incorrecto. Para entender por qué, prueba esto:

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

Como el número 1000 es, de hecho, mayor que 200, es posible que se imprima "La declaración es verdadera"... pero en su lugar aparece "La declaración es falsa". Esto se debe a que ">" actúa como strcmp(), comparando carácter por carácter los códigos ASCII en la cadena (por ejemplo, a < bsería verdadero).

Lo que desea hacer es usar el operador "-gt", como sugirió Kamil, o compararlos usando la expansión aritmética de bash (que puede usar en combinación con if, según man bashla línea 270). Suponiendo que analizó correctamente la salida del comando klist, puede hacer cualquiera de estas cosas:

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

información relacionada