Tengo un pequeño archivo de registro, donde debería encontrar los bots.
Archivo:
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| -
En este archivo, tengo muchas IP, inicios de sesión y nombres de usuario. En primer lugar, pensé en uniq y el recuento de ip. Entonces, ¿qué debo hacer? Debería usar solo eventos: usuario que inició sesión, usuario desconectado, usuario que cerró sesión. A continuación, debo mostrar a los usuarios que iniciaron sesión al mismo tiempo. Primeras tres líneas, el usuario inició sesión, cambió la contraseña y cerró la sesión. Esta hora son las 13:15:39. Y el usuario fxsciaqulmlk de ip 178.57.66.225 es un bot, porque la operación del evento se realizó al mismo tiempo. Mi guión:
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 pregunta es un duplicado exacto de:
Script to search bots from log file 1 answer
He escrito este mensaje antes. Entonces, he hecho mi tarea, pero tengo un resultado un poco incorrecto. Entonces... empezaré. Tengo un archivo de registro:
Lunes, 22 de agosto de 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |usuario conectado| - Lunes, 22 de agosto de 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |usuario cambió contraseña| - Lunes, 22 de agosto de 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |usuario desconectado| - Lunes, 22 de agosto de 2016 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |usuario conectado| - Lunes, 22 de agosto de 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |usuario conectado| - Lunes, 22 de agosto de 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |usuario cambió contraseña| - Lunes, 22 de agosto de 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |usuario desconectado| - Lunes, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuario conectado| - Lunes, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuario conectado| - Lunes, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuario cambió contraseña| - Lunes, 22 de agosto de 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |usuario desconectado| - Lunes, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbab| - |usuario conectado| - Lunes, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbab| - |usuario cambió contraseña| - Lunes, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbab| - |perfil cambiado de usuario| - Lunes, 22 de agosto de 2016 13:17:50 +0200|178.57.66.205|abcbbab| - |usuario desconectado| - Lunes, 22 de agosto de 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |usuario conectado| - Lunes, 22 de agosto de 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |usuario cambió contraseña| - Lunes, 22 de agosto de 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |usuario desconectado| - Lunes, 22 de agosto de 2016 13:20:42 +0200|178.57.67.225|faaaa0a1111| - |usuario conectado| -
Entonces, ¿qué debo hacer? Debería usar solo eventos: usuario que inició sesión, usuario desconectado, usuario que cerró sesión. A continuación, debo mostrar a los usuarios que iniciaron sesión al mismo tiempo. Primeras tres líneas, el usuario inició sesión, cambió la contraseña y cerró la sesión. Esta hora son las 13:15:39. Y el usuario fxsciaqulmlk de ip 178.57.66.225 es un bot, porque la operación del evento se realizó al mismo tiempo. Mi guión:
#!/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
Todo está bien. Pero tengo un mal resultado:
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
¿Dónde tengo un error? No puedo entender dónde tengo un error en el código. Lamento mucho repetir la pregunta, pero ya hice este script, necesito un poco de ayuda.
Respuesta1
Es difícil saber lo que estás pidiendo debido a la barrera del idioma. No tengo claro si está solicitando una forma de recorrer todas las entradas en su archivo de registro o si está intentando determinar cuántas veces un usuario activa un evento específico. En cualquier caso, parece que necesitaría una forma de ver cada línea de su archivo de registro y dividir los diferentes campos.
Hay muchas maneras de hacerlo. Un enfoque simple podría verse así:
#!/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"