У меня есть небольшой лог-файл, в котором я могу найти ботов.
Файл:
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
Где у меня ошибка? Я не могу понять, где у меня ошибка в коде? Извините за повторение вопроса, но я сделал этот скрипт, мне нужна небольшая помощь.
решение1
Трудно понять, о чем вы просите из-за языкового барьера. Я не понимаю, просите ли вы способ перебрать все записи в вашем файле журнала или пытаетесь определить, сколько раз пользователь запускает определенное событие. В любом случае, похоже, вам понадобится способ просмотреть каждую строку вашего файла журнала и разделить различные поля.
Есть много способов сделать это. Простой подход может выглядеть примерно так:
#!/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"