로그 파일에서 봇을 검색하는 스크립트

로그 파일에서 봇을 검색하는 스크립트

봇을 찾아야 하는 작은 로그 파일이 있습니다.

파일:

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 입니다. 그리고 ip 178.57.66.225의 사용자 fxsciaqulmlk는 봇입니다. 이벤트 작업이 동시에 이루어졌기 때문입니다. 내 스크립트:

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

나는 전에 이 메시지를 쓴 적이 있다. 그래서 나는 내 작업을 완료했지만 출력이 약간 정확하지 않습니다. 그럼... 시작하겠습니다. 로그 파일이 있습니다.

2016년 8월 22일 월요일 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |사용자가 로그인했습니다| - 2016년 8월 22일 월요일 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |사용자가 비밀번호를 변경했습니다| - 2016년 8월 22일 월요일 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |사용자가 로그오프했습니다| - 2016년 8월 22일 월요일 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |사용자가 로그인했습니다| - 2016년 8월 22일 월요일 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |사용자가 로그인했습니다| - 2016년 8월 22일 월요일 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |사용자가 비밀번호를 변경했습니다| - 2016년 8월 22일 월요일 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |사용자가 로그오프했습니다| - 2016년 8월 22일 월요일 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |사용자가 로그인했습니다| - 2016년 8월 22일 월요일 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |사용자가 로그인했습니다| - 2016년 8월 22일 월요일 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |사용자가 비밀번호를 변경했습니다| - 2016년 8월 22일 월요일 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |사용자가 로그오프했습니다| - 2016년 8월 22일 월요일 13:17:50 +0200|178.57.66.205|abcbbabab| - |사용자가 로그인했습니다| - 2016년 8월 22일 월요일 13:17:50 +0200|178.57.66.205|abcbbabab| - |사용자가 비밀번호를 변경했습니다| - 2016년 8월 22일 월요일 13:17:50 +0200|178.57.66.205|abcbbabab| - |사용자가 프로필을 변경했습니다| - 2016년 8월 22일 월요일 13:17:50 +0200|178.57.66.205|abcbbabab| - |사용자가 로그오프했습니다| - 2016년 8월 22일 월요일 13:19:19 +0200|178.56.66.225|fxsciulmla| - |사용자가 로그인했습니다| - 2016년 8월 22일 월요일 13:19:19 +0200|178.56.66.225|fxsciulmla| - |사용자가 비밀번호를 변경했습니다| - 2016년 8월 22일 월요일 13:19:19 +0200|178.56.66.225|fxsciulmla| - |사용자가 로그오프했습니다| - 2016년 8월 22일 월요일 13:20:42 +0200|178.57.67.225|faaaa0a1111| - |사용자가 로그인했습니다| -

그래서 내가 무엇을 해야 합니까? 이벤트만 사용해야 합니다: 사용자 로그인, 사용자 변경, 사용자 로그오프. 다음으로, 동시에 로그인한 사용자를 표시해야 합니다. 처음 세 줄은 사용자가 로그인하고, 비밀번호를 변경하고, 로그오프했습니다. 이번 시간은 13:15:39 입니다. 그리고 ip 178.57.66.225의 사용자 fxsciaqulmlk는 봇입니다. 이벤트 작업이 동시에 이루어졌기 때문입니다. 내 스크립트:

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

관련 정보