Die richtige Verarbeitung von Zeichenketten die Auswertungen sehr einfach machen und einem so eine Menge Arbeit ersparen. Den Befehl cat kennt denke ich jeder. cat gibt den Inhalt einer Datei aus. Um nun alle Verbindungen aus der /var/log/mail heruaszufiltern baut sich der Befehl wiefolgt auf
cat /var/log/mail | grep connect | egrep -v '(disconnect|NOQUEUE|lost|statistics|AMAVIS)' ... Dec 30 09:40:35 postfix/smtpd[24538]: connect from mail.starneslaw.com[66.182.161.98] Dec 30 09:40:39 postfix/smtpd[25691]: connect from unknown[125.134.78.108] Dec 30 09:40:50 postfix/smtpd[27354]: connect from unknown[211.201.226.142] Dec 30 09:40:55 postfix/smtpd[24538]: connect from kcin02.prserv.net[12.154.55.42] Dec 30 09:41:00 postfix/smtpd[24538]: connect from unknown[121.156.13.143] Dec 30 09:41:00 postfix/smtpd[27354]: connect from unknown[58.230.121.191] Dec 30 09:41:00 postfix/smtpd[25691]: connect from unknown[121.142.100.162] Dec 30 09:41:04 postfix/smtpd[24538]: connect from unknown[211.201.226.142] ...
Als erstes werden alle Zeilen entfernt, die kein connect enthalten. Anschließend beschränken wir das Ergebniss auf alle unknwon Verbindungen. Danach werden alle Zeilen ausgeschlossen (egrep -v) die ein disconnect, NOQUEUE, lost, statistics oder AMAVIS enthalten. Dafür nutzt man am besten egrep. Es ermöglicht einem mehrere Ausdrücke gleichzeitig zu filtern.
Nun brauche wir für eine spätere Verarbeitung Dec 30 12:12:07 postfix/smtpd[7355]: connect from ja nicht. Also schmeißen wir das auch noch raus:
cat /var/log/mail | grep connect | egrep -v '(disconnect|NOQUEUE|lost|statistics|AMAVIS)' | awk '{print $8}'... segment-210-214-208-27.maa.sify.net[210.214.208.27] unknown[218.156.133.82] unknown[125.135.163.139] unknown[211.53.153.229] kcin04.prserv.net[12.154.55.44] segment-210-214-208-27.maa.sify.net[210.214.208.27] bzq-84-110-234-48.red.bezeqint.net[84.110.234.48] 70-241-254-162.ded.swbell.net[70.241.254.162] nat-tar.aster.pl[212.76.37.138] ...
Um evtl. Leerzeilen zu entfernen kann der Befehl um sed erweitert werden:
cat /var/log/mail | grep connect | egrep -v '(disconnect|NOQUEUE|lost|statistics|AMAVIS)' | awk '{print $8}' | sed '/^$/d'
Nun trennen wir Hostname und IP voneinander. Dazu nutzen wir als erstes das Zeichen „]“ als Trenner und geben vom Ergebniss das erste Feld aus. Anshließend splitten wir den String und nutzen als Trenner „[“ und drehen die daraus resultierenden Felder um. Somit erhalten wir zuerst die IP und anschließend den Hostnamen:
cat /var/log/mail | grep connect | egrep -v '(disconnect|NOQUEUE|lost|statistics|AMAVIS)' | awk '{print $8}' | sed '/^$/d' | cut -d "]" -f 1 | awk '{split($0, feld,"[");print (feld[2], feld[1])}'... 83.10.101.155 ackz155.neoplus.adsl.tpnet.pl 190.42.160.111 unknown 217.97.0.138 unknown 76.65.207.228 TOROON63-1279381476.sdsl.bell.ca 190.42.160.111 unknown 125.142.21.109 unknown 81.215.129.76 unknown 209.85.132.190 an-out-0910.google.com 117.6.43.47 unknown 63.199.244.21 adsl-63-199-244-21.dsl.sndg02.pacbell.net 123.23.213.103 unknown 190.42.160.111 unknown 125.142.21.109 unknown ...
Jetzt das ganze noch zusammen fassen, welche IP wie oft eine Verbindung aufgebaut hat. Dazu fassen wir die Auflistung der IP Adressen zusammen (uniq -c) und sortieren das Ergebniss anschließend Nummerisch (-n) und drehen das Ergebniss um, damit die größere Zahl an Treffern ob steht (-r):
cat /var/log/mail | grep connect | egrep -v '(disconnect|NOQUEUE|lost|statistics|AMAVIS)' | awk '{print $8}' | sed '/^$/d' | cut -d "]" -f 1 | awk '{split($0, feld,"[");print (feld[2], feld[1])}' |uniq -c | sort -nr... 16 200.104.157.159 pc-159-157-104-200.cm.vtr.net 14 83.29.113.172 brt172.neoplus.adsl.tpnet.pl 14 83.23.109.85 def85.neoplus.adsl.tpnet.pl 14 190.48.225.8 unknown 11 203.130.67.59 unknown 10 124.91.67.238 unknown 9 84.55.207.195 unknown 9 72.79.178.212 pool-72-79-178-212.sctnpa.east.verizon.net ...
Datei Zeilenweise verarbeiten
Was auch noch ganz interessant ist, ist Zeilenweise Verarbeitung einer Datei. Dazu wird in folgendem Beispiel eine Datei mit IP Adressen von Hosts erstellt, die sich über SMTP mit dem Server verbunden haben. Anschließend wird für jede IP Adresse in dieser Datei der PTR über dig abgefragt. Sollten mehr als 1 PTR zurück gegeben werden, wird nur der erste ausgegeben.
#/bin/bashconnect_ip=$(cat /var/log/mail | grep connect | egrep -v '(disconnect|lost|client|NOQUEUE)' | awk '{print $8}' |cut -d "[" -f 2 | cut -d "]" -f 1)cat $connect_ip |while read line do mail_PTR=$(dig +short -x $mail_IP | tr "n" " " |awk '{print $1}'); sleep 0.25 done;