Ich arbeite an einem Skript, in dem ich Eingaben wie Zeit und Ordnername erhalte. Ich muss eine Datei (snort.log.*) finden, die in den von meinem Benutzer eingegebenen Zeitraum fällt (er sieht den fettgedruckten Zeitstempel der Warndatei und gibt diese Zeit für die eigentliche Datei snort.log.** ein, die die Details des Angriffs enthält, und die Warndatei enthält nur die Metadaten). Hier ist ein Verzeichnisbeispiel
[jump1@widids01 snort-3]# ls -ltr | Schwanz -6 -rwxr-x--- 1 schnauben schnauben 301731 2. Feb 18:18 snort.log.1517557015 -rwxr-x--- 1 schnauben schnauben 5720853 5. Feb. 21:11 snort.log.1517563475 -rwxr-x--- 1 schnauben schnauben 3566073 7. Feb. 16:00 snort.log.1517832965 -rwxr-x--- 1 schnauben schnauben 18999 7. Feb. 20:46 snort.log.1518003111 -rwxr-x--- 1 schnauben schnauben 20705098 Feb 15 19:00 snort.log.1518004113 -rw------- 1 schnauben schnauben 357271 15. Feb 22:22 snort.log.1518688923 -rwxr-x--- 1 schnauben schnauben 50782147 Feb 15 22:22 Alarm [jump1@widids01 snort-3]# tail -3 Alarm 15.02.-18:22:02.204655 [1:2403380:38412] ET CINS Active Threat Intelligence Schlechte Reputation IP TCP-Gruppe 41 [Klassifizierung: Sonstiger Angriff] [Priorität: 2] {TCP} 15.02.-22:22:03.335107 [1:2403408:38412] ET CINS Active Threat Intelligence Schlechte Reputation IP TCP-Gruppe 55 [Klassifizierung: Sonstiger Angriff] [Priorität: 2] {TCP} 15.02.-22:22:03.335107 [1:2403408:38412] ET CINS Active Threat Intelligence Schlechte Reputation IP TCP-Gruppe 55 [Klassifizierung: Sonstiger Angriff] [Priorität: 2] {TCP}
Ich stehe vor den Problemen hier, das snort.log.[epoch]
heißt [epoch]
, die Datei wird generiert, wenn der Benutzer also
Testfall1:
time:2015-02-15-22:28:02
wie man ihm die Übereinstimmung snort.log.file
mit den Angaben gibt, die die Angriffsdaten enthalten
Testfall2:
time:2015-02-15-18:22:02
wie man ihm die Übereinstimmung snort.log.file
mit den Angaben gibt, die die Angriffsdaten enthalten
Ich habe es versucht, aber find . -newermt "2018-02-15 18:38:00" ! -newermt "2018-02-15 18:39:00"
ich bekomme keine richtige Ausgabe.
Antwort1
Angenommen, Sie haben eine Eingabe wie diese:
time="time:2015-02-15-18:22:02"
Anschließend können Sie es in einen Unix-Zeitstempel (Sekunden seit Epoche) umwandeln und mit folgendem Befehl in einer Variablen speichern timestamp
:
time=$(date -d$(<<<"$time" sed 's/time:\(.*\)-/\1T/') +%s)
Ich verwende sed
hier, um das Präfix loszuwerden time:
und den Doppelpunkt zwischen Datum und Uhrzeit zu ändern in T
(ISO 8601), date
wird dann verwendet, um den Zeitstempel in Sekunden seit Epoche umzurechnen.
Je nachdem, was dieser Zeitstempel darstellt, können Sie dann find
den Dateinamen des Protokolls ausgeben:
Wenn der Dateiname bereits den Zeitstempel enthält, können Sie
snort.log.$time
direkt verwendenwenn es die Änderungszeit der Datei ist:
find . -type f -name "*snort.log.*" -newermt @$(($time-1)) ! -newermt @$time
Dadurch werden alle Protokolldateien mit einer Änderungszeit zwischen
time
-1 Sekunde und gefundentime
.Wenn Sie die älteste Protokolldatei nach dem angegebenen Zeitstempel suchen müssen, können Sie
sort
und verwendenhead
:find . -type f -name "*snort.log.*" -newermt @$(($time-1)) -print0 | sort -z | head -zn1
wenn Sie die Protokolldatei finden müssen, die (auf irgendeine Weise)enthältden angegebenen Zeitstempel verwenden
grep
:grep -l $time *
Wenn Sie viele lange Protokolldateien haben, kombinieren Sie dies möglicherweise mit
find
und/oderparallel
um es schneller zu machen, z. B.:find . -type f -name "*snort.log.*" -newermt @$(($time-1)) -exec grep -l $time {} +