Wie verwende ich Syslog für andere Ausgaben (mit whois - query anzeigen)?

7

Es gibt eine Protokolldatei /var/log/syslog mit der Ausgabe von IP-Adressen wie z SRC=10.158.0.1.

Ich möchte aus dieser Datei jede gedruckte Adresse scannen SRC= ...und dann mit abfragen whois (SRC= ...).

Diese Abfrage sollte überwacht werden.

Mein Versuch ist falsch und sieht in einem Bash-Skript so aus:

#/bin/bash

while [ 1 ]
do
    grep SRC=ip-address /var/log/syslog >> /home/$user/topsecret001/pitbull001.txt;
    whois SRC=ip-address >> /home/$user/topsecret001/pitbull002.txt;
done

Kann jemand mit einem Trick helfen? Wie soll ich die IP-Adresse definieren und wie kann ich den Befehl whoismit dieser IP-Adresse verwenden?

Die Ausgabe von / var / log / syslog sieht hier wie folgt aus:

http://paste.ubuntu.com/5859332/

Die Ausgabe von / var / log / syslog sieht folgendermaßen aus - wenn eine kleine Warnung vorliegt (wie heute):

http://paste.ubuntu.com/5862958/

Es wäre auch eine Idee, eine whois-Abfrage nur durchzuführen, wenn in der Zeile des scrollenden Syslogs ein "ungültiger Status" angezeigt wird.


Vielen Dank für Ihre Beiträge. Ich habe etwas durch Ihre Codes gelernt. Oft sehen die Lösungen einfacher aus als hier gedacht - weil ich dachte, es wäre schwieriger. Ich denke mit dem jüngsten Beitrag von Enzotib ist diese Frage dann schon jetzt gelöst.


siehe neuen Kommentar von heute (22. Juni 2016) zum 16.04:

Weil dieses Bash-Skript für Zeiten von IPv4 war - muss dann /etc/sysctl.conf nicht kommentiert werden, um IPv4 zu aktivieren? - Dann würde dieses Skript ausgeführt? Ansonsten gibt es keine whois-Ausgabe mehr wie zuvor. Habe dies mit den Kommentaren 28 und 33 von /etc/sysctl.conf überprüft - dann würde dieses Bash-Skript in diesem Thread funktionieren, aber nur sehr wenige Ausgaben liefern, da der Anbieter die Firewall aktiviert hat (wegen No-Spy-Act?). Auf diese Weise wird dieser Thread durch diesen Zusatz vom 22. Juni 2016 für den 16.04. Aktualisiert

dschinn1001
quelle
Wenn es mehrere richtige Antworten gleichzeitig gibt, bekommt der geringste Ruf das Kopfgeld, weil ich fair sein möchte.
dschinn1001
Können Sie Ihre /var/log/syslogDatei auf paste.ubuntu.com veröffentlichen und wir geben den Link bitte. Das liegt daran, dass ich nichts Vergleichbares SRC= ...in meiner /var/log/syslogDatei habe.
Radu Rădeanu
Ich weiß nicht, ob ich noch die alte passende Protokolldatei zu dieser oben erwähnten IP-Adresse habe - kann aber natürlich den aktuellen Stand als Snippet mit derselben IP posten.
dschinn1001
wua! Schon jetzt - ich weiß nicht, wem ich das Kopfgeld geben soll - werde ich warten und über 5 bis 6 Tage nachdenken.
dschinn1001
Wahr ! - Ich habe ein bisschen geschlafen ...; o) bin somnambule!
dschinn1001

Antworten:

8

Noch eine andere Lösung:

awk '{ 
      for (i = 1; i <= NF; i++) 
        if ($i ~ /^SRC=/) 
          print substr($i, 5) 
    }' /var/log/syslog |
  sort -u |
  while read ip; do
    printf ' === %s ===\n' "$ip"
    whois "$ip"
  done

Wenn Sie nur Zeilen auswählen möchten, syslogdie die Zeichenfolge enthalten INVALID STATE, kann der obige Code wie folgt geändert werden

awk '/INVALID STATE/ { 
      for (i = 1; i <= NF; i++) 
        if ($i ~ /^SRC=/) 
          print substr($i, 5) 
    }' /var/log/syslog |
  sort -u |
  while read ip; do
    printf ' === %s ===\n' "$ip"
    whois "$ip"
  done
Enzotib
quelle
+1 für die Antwort, aber ich sehe keinen Grund, 10 Mal anzuwenden whois $IP, wenn dieselbe IP 10 Mal in / var / log / syslog erscheint (wie hier: paste.ubuntu.com/5859332 ). Höchstwahrscheinlich wird sich das Ergebnis von whois one_specific_ipin naher Zukunft nicht ändern.
Radu Rădeanu
1
@ RaduRădeanu: Oh, du hast recht, verändert.
Enzotib
@enzotib ja wahr - habe vergessen, dies in Frage zu stellen, über einen kleinen eingebauten Alarmmodus. Wenn es einen "Alien" -Ping oder eine "Alien" -Anforderung gibt, listet Syslog diese mit der Ankündigung "fremde Adresse" in der Zeile auf.
dschinn1001
@enzotib sorry - dann taucht nicht "fremde Adresse" auf - stattdessen taucht "ungültiger Zustand" auf!
dschinn1001
@ dschinn1001: Überprüfen Sie, ob die geänderte Antwort Ihrer neuen Anforderung entspricht.
Enzotib
5

Sie können einen sedBefehl verwenden, um alle IP-Adressen der IP-Adressen aus der Datei zu extrahieren und dann für jede Übereinstimmung xargsauszuführen whois:

sed 's/^.*SRC=\([0-9.]*\).*$/\1/;t;d' < /var/log/syslog | xargs -n1 whois >> output.txt

Der s/^.*SRC=\([0-9.]*\).*$/\1/Befehl ersetzt Zeilen, die SRC = xxxx enthalten, nur durch die IP-Adresse.

Die Befehle 't; d' überspringen nicht übereinstimmende Zeilen (wodurch ein separater grepBefehl vermieden wird ).

Der xargsBefehl wird whoisfür jede ausgegebene Adresse einmal sedaufgerufen.


Alternativ können Sie zuerst die übereinstimmenden Zeilen suchen und protokollieren und dann die IP-Adressen separat extrahieren:

grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`
cscarney
quelle
Das sieht gut aus, oben in der ersten Lösung ist / var / log / syslog einfach mit '<' "angedockt"?
dschinn1001
Das sieht gut aus, oben in der ersten Lösung ist / var / log / syslog einfach mit '<' "angedockt"?
dschinn1001
Das < sendet den Inhalt von / var / log / syslog an sedon stdin.
cscarney
Ich erhalte diesen Fehler:Usage: whois [OPTION]... OBJECT...
Radu Rădeanu
Enthält Ihre Syslog-Datei IP-Adressen? Fügen Sie xargs das Flag -r hinzu, wenn Sie den Fall behandeln müssen, in dem die Adressliste leer ist.
cscarney
3

Vielleicht ist der folgende Code ein geeigneter Ausgangspunkt für Sie. Es ist wahrscheinlich nicht die optimale Lösung, aber es macht seinen Job.

Es besteht aus einer for-Schleife über alle Ausgabezeilen des Befehls innerhalb von $ (). In jeder Iteration der Schleife wird eine Ausgabezeile in der Variablen IP gespeichert. Dann wird in der Schleife der Befehl whois mit $ IP - dem Inhalt der Variablen IP - als Argument aufgerufen.

Die Klammern $ () schließen zwei grep-Befehle ein - der erste sucht nach IP-Adressen, vor denen SRC = steht, und der zweite nimmt die Ausgabe des ersten (über eine Pipe |) und nimmt nur die IP-Adresse. Das Flag -o von grep bewirkt, dass nur der übereinstimmende Teil der Zeilen anstelle der vollständigen Zeilen ausgegeben wird.

Der reguläre Ausdruck ist auch noch nicht sehr elegant. Es wird nach drei Gruppen gesucht, die jeweils aus ein bis drei Ziffern und einem Punkt bestehen, gefolgt von ein bis drei Ziffern. Um das Skript lesbar zu halten, habe ich mich für erweiterte reguläre Ausdrücke -E entschieden. Der "normale" grep-Befehl würde einen Backslash vor jeder runden und geschweiften Klammer erfordern ...

for IP in \
 $(grep  -E "SRC=([0-9]{1,3}\.){3}[[0-9]{1,3}" -o  /var/log/syslog  | \
 grep -E "([0-9]{1,3}\.){3}[[0-9]{1,3}" -o);
    do whois $IP;
done
Seelenquelle
quelle
Diese Lösung ist didaktischer.
dschinn1001
2

Ihr Skript sollte folgendermaßen aussehen:

#/bin/bash

grep 'SRC=' /var/log/syslog | awk 'BEGIN {FS="[ \t]+|\\|"} {print $13}' | uniq >> ~/topsecret001/pitbull001.txt

for ip in $(sed -e 's/SRC=//g' ~/topsecret001/pitbull001.txt)
do 
    whois $ip >> ~/topsecret001/pitbull002.txt
done
Radu Rădeanu
quelle
0

Für das Hinzufügen einer Option - im Falle des Auftauchens von "INVALID STATE" - würde dies dann funktionieren? ::

awk '{

    for (i = 1; i <= NF; i++)

      if ($i ~ /^SRC=/)

         print substr($i, 5)

   }' /var/log/syslog | sort -u | while read ip; 

do

   printf ' INVALID STATE ' && printf ' === %s ===\n' "$ip"

   whois "$ip"

 done
dschinn1001
quelle
Dieser Code von Enzotib funktioniert - nachdem er getestet wurde. Das würde dann also schon als neuer Daemon funktionieren.
dschinn1001