我有一个小日志文件,我应该在那里找到机器人。
文件:
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"