我有一個小日誌文件,我應該在其中找到機器人。
文件:
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"