Skript zum Suchen von Bots in der Protokolldatei

Skript zum Suchen von Bots in der Protokolldatei

Ich habe eine kleine Protokolldatei, in der ich die Bots finden sollte.

Datei:

Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user logged in| -
Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user changed password| -
Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user logged off| -
Mon, 22 Aug 2016 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |user logged in| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user changed password| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user logged off| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user changed password| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged off| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user logged in| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user changed password| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user changed profile| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user logged off| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |user logged in| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |user changed password| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |user logged off| -
Mon, 22 Aug 2016 13:20:42 +0200|178.57.67.225|faaaa0a1111| - |user logged in| -

In dieser Datei habe ich viele IPs, Logins und Benutzernamen. Zuerst habe ich über Uniq und IP-Anzahl nachgedacht. Was sollte ich also tun? Ich sollte nur Ereignisse verwenden: Benutzer angemeldet, Benutzer abgemeldet, Benutzer abgemeldet. Als nächstes sollte ich die Benutzer anzeigen, die sich gleichzeitig angemeldet haben. Die ersten drei Zeilen: Benutzer hat sich angemeldet, Passwort geändert, abgemeldet. Diesmal ist es 13:15:39. Und Benutzer fxsciaqulmlk von IP 178.57.66.225 ist ein Bot, weil die Ereignisoperation gleichzeitig ausgeführt wurde. Mein Skript:

log_file=/root/log
log_after=/root/after_log
temp_file=/root/temp
temp_file2=/root/temp2
uniq_file=/root/uniq
uniq_file2=/root/uniq2
result_uniq=/root/result_uniq
result_file=/root/result

cat /dev/null > $log_after
cat /dev/null > $temp_file
cat /dev/null > $temp_file2
cat /dev/null > $uniq_file
cat /dev/null > $uniq_file2
cat /dev/null > $result_file

grep "changed password\|logged in\|logged off" $log_file > $log_after
cat $log_after | awk '{print $6}' | awk -F "|" '{print $2,$3}' | tail -n 20 > $temp_file
cat $log_after | awk '{print $5}' | tail -n 20 > $temp_file2
uniq -c $temp_file | awk '{print $1}' > $uniq_file
uniq -c $temp_file2 | awk '{print $1}' > $uniq_file2

awk 'FNR==NR{a[$1]++;next}!a[$1]' $uniq_file  $uniq_file2  > $result_uniq

if [ -s $result_uniq ] && [ -f $result_uniq ]; then
 echo "File is not  empty"
 echo "Differences:"
 cat $result_uniq
 echo "Need to think"
 exit 0
else
 echo "File is empty"
 echo "We can use one file from uniq"
fi

for i in `uniq -c $temp_file | awk '{print $1}'`; do
if [ $i -gt 2 ]; then
s=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $3}'`
ss=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $2}'`
echo "Tho boot is user $s with ip $ss"
fi
done

Diese Frage ist eine exakte Kopie von:

Script to search bots from log file 1 answer

Ich habe diese Nachricht schon einmal geschrieben. Ich habe meine Aufgabe also erledigt, aber die Ausgabe ist nicht ganz korrekt. Also... ich fange an. Ich habe eine Protokolldatei:

Mo., 22. August 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |Benutzer angemeldet| - Mo., 22. August 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |Benutzer hat Passwort geändert| - Mo., 22. August 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |Benutzer abgemeldet| - Mo., 22. August 2016 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |Benutzer angemeldet| - Mo., 22. August 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |Benutzer angemeldet| - Mo., 22. August 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |Benutzer hat Passwort geändert| - Mo., 22. August 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |Benutzer abgemeldet| - Mo., 22. August 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |Benutzer angemeldet| - Mo., 22. August 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |Benutzer angemeldet| - Mo., 22. August 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |Benutzer hat Passwort geändert| - Mo., 22. August 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |Benutzer abgemeldet| - Mo., 22. August 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |Benutzer angemeldet| - Mo., 22. August 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |Benutzer hat Passwort geändert| - Mo., 22. August 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |Benutzer hat Profil geändert| - Mo., 22. August 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |Benutzer abgemeldet| - Mo., 22. August 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |Benutzer angemeldet| - Mo., 22. August 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |Benutzer hat Passwort geändert| - Mo., 22. August 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |Benutzer abgemeldet| - Mo., 22. August 2016 13:20:42 +0200|178.57.67.225|faaaa0a1111| - |Benutzer angemeldet| -

Was soll ich also tun? Ich sollte nur Ereignisse verwenden: Benutzer angemeldet, Benutzer abgemeldet, Benutzer abgemeldet. Als nächstes sollte ich die Benutzer anzeigen, die sich gleichzeitig angemeldet haben. Die ersten drei Zeilen: Benutzer hat sich angemeldet, Passwort geändert, abgemeldet. Diesmal ist es 13:15:39. Und Benutzer fxsciaqulmlk von IP 178.57.66.225 ist ein Bot, weil die Ereignisoperation gleichzeitig ausgeführt wurde. Mein Skript:

#!/bin/bash
# you should add it script in crontab, like this
#*/2 * * * *      /name_of_this_script.sh
# you should change variable way in $log_file to your own way

log_file=/root/log
log_after=/root/after_log
temp_file=/root/temp
temp_file2=/root/temp2
uniq_file=/root/uniq
uniq_file2=/root/uniq2
result_uniq=/root/result_uniq
result_file=/root/result

cat /dev/null > $log_after
cat /dev/null > $temp_file
cat /dev/null > $temp_file2
cat /dev/null > $uniq_file
cat /dev/null > $uniq_file2
cat /dev/null > $result_file

grep "changed password\|logged in\|logged off" $log_file > $log_after
cat $log_after | awk '{print $6}' | awk -F "|" '{print $2,$3}' | tail -n 20 > $temp_file
cat $log_after | awk '{print $5}' | tail -n 20 > $temp_file2
uniq -c $temp_file | awk '{print $1}' > $uniq_file
uniq -c $temp_file2 | awk '{print $1}' > $uniq_file2

awk 'FNR==NR{a[$1]++;next}!a[$1]' $uniq_file  $uniq_file2  > $result_uniq

if [ -s $result_uniq ] && [ -f $result_uniq ]; then
 echo "File is not  empty"
 echo "Differences:"
 cat $result_uniq
 echo "Need to think"
 exit 0
else
 echo "File is empty"
 echo "We can use one file from uniq"
fi

for i in `uniq -c $temp_file | awk '{print $1}'`; do
if [ $i -gt 2 ]; then
s=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $3}'`
ss=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $2}'`
echo "Tho boot is user $s with ip $ss"
fi
done

Alles ok. Aber ich habe ein schlechtes Ergebnis:

Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225
Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225
Tho boot is user erdsfsdfsdf with ip 178.57.66.205
Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225
Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225

Wo habe ich einen Fehler? Ich kann nicht verstehen, wo ich einen Fehler im Code habe? Es tut mir so leid, dass ich die Frage wiederhole, aber ich habe dieses Skript gemacht, ich brauche ein wenig Hilfe.

Antwort1

Aufgrund der Sprachbarriere ist es schwierig zu sagen, wonach Sie fragen. Mir ist nicht klar, ob Sie nach einer Möglichkeit fragen, alle Einträge in Ihrer Protokolldatei zu durchlaufen, oder ob Sie versuchen zu ermitteln, wie oft ein Benutzer ein bestimmtes Ereignis auslöst. In beiden Fällen scheinen Sie eine Möglichkeit zu benötigen, jede Zeile Ihrer Protokolldatei anzuzeigen und die verschiedenen Felder aufzuteilen.

Dafür gibt es viele Möglichkeiten. Ein einfacher Ansatz könnte etwa so aussehen:

#!/bin/bash
log="/root/auth.log"
result="/root/bots.result"

# we probably don't need the intermediate file 
# temp=/root/log.temp

# a simple redirect can clear the output file
> $result

# read every line of the log file
while read line; do
   # split fields with 'cut' using whitespace as a delimiter
   date=`echo "$line" | cut -d' ' -f1-5`

   # split using pipe as a delimiter
   ip=`echo "$line" | cut -d'|' -f2`
   user=`echo "$line" | cut -d'|' -f3`
   event=`echo "$line" | cut -d'|' -f5`

   # report results
   echo "date:$date user:$user from ip:$ip $event" >> "$results"
done < "$log"

verwandte Informationen