Скрипт для поиска ботов из файла журнала

У меня есть небольшой лог-файл, в котором я должен найти ботов.

Файл:

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| -

В этом файле, У меня много ip, логинов, логинов. в первую очередь подумал об uniq и подсчете ip. Итак, что мне делать. Я должен использовать только события: пользователь вошел в систему, пользователь отключился, пользователь вышел из системы. Затем я должен показать пользователей, которые вошли в систему в то же время. Первые три строки, пользователь вошел в систему, сменил пароль, вышел из системы. На этот раз 13:15:39. А пользователь fxsciaqulmlk с ip 178.57.66.225 является ботом, потому что одновременно произошло срабатывание события. Мой сценарий:

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

Этот вопрос является точной копией:

Script to search bots from log file 1 answer

Я уже писал это сообщение раньше. Итак, я выполнил свою задачу, но у меня немного неверный результат. Итак ... я начну. У меня есть файл журнала:

Пн, 22 августа 2016 13:15:39 +0200 | 178.57.66.225 | fxsciaqulmlk | - | пользователь вошел в систему | - Пн, 22 августа 2016 13:15:39 +0200 | 178.57.66.225 | fxsciaqulmlk | - | пользователь изменил пароль | - Пн, 22 августа 2016 13:15:39 +0200 | 178.57.66.225 | fxsciaqulmlk | - | пользователь вышел из системы | - Пн, 22 августа 2016 13:15:42 +0200 | 178.57.66.225 | faaaaaa11111 | - | пользователь вошел в систему | - Пн, 22 августа 2016 13:15:49 +0200 | 178.57.66.215 | terdsfsdfsdf | - | пользователь вошел в систему | - Пн, 22 августа 2016 13:15:49 +0200 | 178.57.66.215 | terdsfsdfsdf | - | пользователь изменил пароль | - Пн, 22 августа 2016 13:15:49 +0200 | 178.57.66.215 | terdsfsdfsdf | - | пользователь вышел из системы | - Пн, 22 августа 2016 13:15:59 +0200 | 178.57.66.205 | erdsfsdfsdf | - | пользователь вошел в систему | - Пн, 22 августа 2016 13:15:59 +0200 | 178.57.66.205 | erdsfsdfsdf | - | пользователь вошел в систему | - Пн, 22 августа 2016 13:15:59 +0200 | 178.57.66.205 | erdsfsdfsdf | - | пользователь изменил пароль | - Пн, 22 августа 2016 13:15:59 +0200 | 178.57.66.205 | erdsfsdfsdf | - | пользователь вышел из системы | - Пн, 22 августа 2016 13:17:50 +0200 | 178.57.66.205 | abcbbabab | - | пользователь вошел в систему | - Пн, 22 августа 2016 13:17:50 +0200 | 178.57.66.205 | abcbbabab | - | пользователь изменил пароль | - Пн, 22 августа 2016 13:17:50 +0200 | 178.57.66.205 | abcbbabab | - | пользователь изменил профиль | - Пн, 22 августа 2016 13:17:50 +0200 | 178.57.66.205 | abcbbabab | - | пользователь вышел из системы | - Пн, 22 авг 2016 13:19:19 +0200 | 178.56.66.225 | fxsciulmla | - | пользователь вошел в систему | - Пн, 22 авг 2016 13:19:19 +0200 | 178.56.66.225 | fxsciulmla | - | пользователь изменил пароль | - Пн, 22 авг 2016 13:19:19 +0200 | 178.56.66.225 | fxsciulmla | - | пользователь вышел из системы | - Пн, 22 авг. 2016 13:20:42 +0200 | 178.57.67.225 | faaaa0a1111 | - | пользователь вошел в систему | -

Итак, что мне делать. Я должен использовать только события: пользователь вошел в систему, пользователь отключился, пользователь вышел из системы. Затем я должен показать пользователей, которые вошли в систему в то же время. Первые три строки, пользователь вошел в систему, сменил пароль, вышел из системы. На этот раз 13:15:39. А пользователь fxsciaqulmlk с ip 178.57.66.225 является ботом, потому что одновременно произошло срабатывание события. Мой сценарий:

#!/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

Все ок. Но у меня плохой результат:

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

Где у меня ошибка? Я не могу понять, где у меня ошибка в коде? Прошу прощения за повторный вопрос, но я сделал этот сценарий, мне нужна небольшая помощь.

-2
задан 23 January 2017 в 22:17
1 ответ

Este dificil să spui ce ceri din cauza barierei lingvistice. Nu sunt clar dacă solicitați o modalitate de a parcurge toate intrările din fișierul jurnal sau dacă încercați să determinați de câte ori un utilizator declanșează un anumit eveniment. În ambele cazuri, se pare că ai avea nevoie de un mod de a privi fiecare linie a fișierului jurnal și de a împărți diferitele câmpuri.

Există multe modalități de a face acest lucru. O abordare simplă ar putea arăta cam așa:

#!/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"
0
ответ дан 5 December 2019 в 21:38

Теги

Похожие вопросы