
Ich erstelle ein Skript, mit dem ich überprüfen kann, ob etwas abgelaufen ist, beispielsweise ein Kerberos-Ticket-Cache.
Ich muss das Ablaufdatum/die Ablaufzeit und das aktuelle Datum/die aktuelle Uhrzeit abrufen und beides vergleichen, um zu sehen, ob das erste Datum/die erste Uhrzeit abgelaufen ist.
Ich erstelle ein Skript, um zu sehen, ob ein Kerberos-Ticket noch gültig oder abgelaufen ist.
Ich kann das Ablaufdatum und die Ablaufzeit für beide im Epochenformat abrufen (vorausgesetzt, das ist am besten).
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)
Ich möchte in einer if-Anweisung sehen, ob das Kerberos-Ticket abgelaufen ist. Ich habe Probleme mit der Logik der if-Anweisung, die mit der Zeit arbeitet. Ich habe meine Frage hier vielleicht selbst beantwortet, aber sollte CURRENTEPOCH größer als KRBEXPEPOCH sein, dann wird „Ticket ist ungültig“ als Echo ausgegeben. Ist das sinnvoll?
if [[ "$CURREPOCH" > "$KRBEXPEPOCH" ]] ;
then
echo "Ticket is not valid"
fi
Antwort1
Vergleichen des aktuellen Datums und des Ablaufdatums durch Umrechnen inSekunden ab Epocheist eine gute Methode, um festzustellen, ob Ihr Ticket abgelaufen ist oder nicht. Solange Sie es vom selben Host beziehen CURREPOCH
, KRBEXPEPOCH
können Sie den aktuellen Status des Tickets ziemlich genau feststellen (wenn Sie es nicht vom selben Host beziehen, beachten Sie, dass die erhaltenen Daten möglicherweise unterschiedlichen Zeitzonen entsprechen und Sie sie entsprechend verschieben müssen).
Wie Kamil jedoch in seinem Kommentar erwähnte, weist die Implementierung, die Sie in Ihrer Antwort verwendet haben, ein entscheidendes Problem auf: Wie Sie in man bash
Zeile 1753 sehen können, vergleicht der Operator ">" Zeichenfolgen. Für Ihre Anwendung ist dies im Allgemeinen falsch. Um zu verstehen, warum, versuchen Sie Folgendes:
if [[ "1000" > "200" ]]; then
echo "Statement is true"
else
echo "Statement is false"
fi
Da die Zahl 1000 tatsächlich größer als 200 ist, erwarten Sie vielleicht, dass „Anweisung ist wahr“ ausgegeben wird … aber stattdessen erhalten Sie „Anweisung ist falsch“. Das liegt daran, dass ">" wie ein strcmp() funktioniert und die ASCII-Codes der Zeichenfolge Zeichen für Zeichen vergleicht (z. B. a < b
wäre wahr).
Sie möchten entweder den Operator „-gt“ verwenden, wie Kamil vorgeschlagen hat, oder sie mithilfe der arithmetischen Erweiterung von Bash vergleichen (die Sie in Kombination mit verwenden können if
, gemäß man bash
Zeile 270). Vorausgesetzt, Sie haben die Ausgabe des Befehls klist richtig analysiert, können Sie Folgendes tun:
if [[ "$CURREPOCH" -gt "$KRBEXPEPOCH" ]]; then echo "expired"; fi
if (( $CURREPOCH > $KRBEXPEPOCH )); then echo "expired"; fi