Script para pesquisar bots no arquivo de log

Script para pesquisar bots no arquivo de log

Eu tenho um pequeno arquivo de log, onde devo encontrar os bots.

Arquivo:

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

Neste arquivo, tenho muitos ip, logins, nomes de usuário. antes de mais nada pensei em uniq e contagem de ip. Então, o que devo fazer. Devo usar apenas eventos: usuário logado, usuário desligado, usuário desconectado. A seguir, devo mostrar os usuários que efetuaram login ao mesmo tempo. As três primeiras linhas, o usuário efetuou login, alterou a senha e efetuou logoff. Desta vez são 13:15:39. E o usuário fxsciaqulmlk do ip 178.57.66.225 é um bot, pois a operação do evento foi feita ao mesmo tempo. Meu roteiro:

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

Esta pergunta é uma duplicata exata de:

Script to search bots from log file 1 answer

Já escrevi esta mensagem antes. Então, eu fiz minha tarefa, mas tenho uma saída um pouco incorreta. Então... vou começar. Eu tenho um arquivo de log:

Seg, 22 de agosto de 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |usuário logado| - Seg, 22 de agosto de 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |usuário alterou senha| - Seg, 22 de agosto de 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |usuário desconectado| - Seg, 22 de agosto de 2016 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |usuário logado| - Seg, 22 de agosto de 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |usuário logado| - Seg, 22 de agosto de 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |usuário alterou senha| - Seg, 22 de agosto de 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |usuário desconectado| - Seg, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuário logado| - Seg, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuário logado| - Seg, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuário alterou senha| - Seg, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuário desconectado| - Seg, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |usuário logado| - Seg, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |usuário alterou senha| - Seg, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |usuário mudou de perfil| - Seg, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |usuário desconectado| - Seg, 22 de agosto de 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |usuário logado| - Seg, 22 de agosto de 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |usuário alterou senha| - Seg, 22 de agosto de 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |usuário desconectado| - Seg, 22 de agosto de 2016 13:20:42 +0200|178.57.67.225|faaaa0a1111| - |usuário logado| -

Então, o que devo fazer. Devo usar apenas eventos: usuário logado, usuário desligado, usuário desconectado. A seguir, devo mostrar os usuários que efetuaram login ao mesmo tempo. As três primeiras linhas, o usuário efetuou login, alterou a senha e efetuou logoff. Desta vez são 13:15:39. E o usuário fxsciaqulmlk do ip 178.57.66.225 é um bot, pois a operação do evento foi feita ao mesmo tempo. Meu roteiro:

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

Tudo ok. Mas tenho um resultado ruim:

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

Onde eu cometi um erro? Não consigo entender, onde estou cometendo um erro no código? Sinto muito por repetir a pergunta, mas fiz esse script, preciso de uma ajudinha.

Responder1

É difícil saber o que você está pedindo devido à barreira do idioma. Não estou claro se você está solicitando uma maneira de percorrer todas as entradas em seu arquivo de log ou se está tentando determinar quantas vezes um usuário aciona um evento específico. Em ambos os casos, parece que você precisaria examinar cada linha do seu arquivo de log e dividir os diferentes campos.

Há muitas maneiras de fazer isso. Uma abordagem simples poderia ser mais ou menos assim:

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

informação relacionada