Linux日志文件内容过滤和日志文件排序
从去年10月底进入网络中心到现在,刚好整整一年。去年,受老师和武哥提携,有幸进入校网络中心,刚进去那时就懂点超简单的Linux命令,那天武哥做数据库清查,看着他在控制台下一条条命令敲出去,然后ssh终端输出各种看不懂的信息,觉得武哥超厉害,Linux玩得如此熟练,而自己连个菜鸟都不如。可惜,武哥只带了我一次,就去北京了,当时网络中心搞技术的就留下我和另外一个大二的学弟,而且他还处于学习的地步,自然是不能带我的,顿时感觉压力山大。没办法,硬着头皮上。到如今,一年过去了,虽然很多时候命令还是记不住,还是需要百度谷歌,但是不再有当年的青涩,面对工作,能轻松面对。很感谢自己能有这个机会,虽然这一年没太大进步,但是至少学了点东西,认识了很多人,锻炼了很多……
镜头拉回今天,今天下午值班的工作是日志分析,以前基本没做过类似的工作,所谓分析,无外乎从中提取点有用的东西出来。前天发现服务器上某网站被黑,网站文件被篡改,经查,ftp帐号被黑客破解。处理工作很简单,修改ftp密码,恢复网站备份即可。但是老师要我们查查ftp的日志文件,想知道还有没有别的帐号被破解,于是,真正的工作开始了……
服务器是Linux系统,日志文件在/var/log目录下,vsftpd.log,一个300多M的文本文件。因为网站是最近刚被黑的,看来ftp被破解没多久,于是把目光放到日志文件的最后面,那么,怎么查看日志文件呢,一个cat命令出去,得到的只有无尽的刷屏~要知道有700W行记录啊!还好Linux有 tail 命令和 head 命令,顾名思义,自然是只查看文件最后面和最前面的记录,执行:
tail vsftp.log
默认显示最后10条记录,head命令同样,但是可以通过参数 -n 指定显示后/前多少行,于是修改命令,执行:
tail -n100 file
开始发现同一个外网ip多次出现,再多来点数据,但是上百条以上的数据在控制台下不好看,这时就要用到管道和 tee 命令了,这个命令可以帮助把数据追加到文件中,执行:
tail -n1000 file | tee res.txt
有人会说直接重定向到文件中就行,干嘛还要 tee 命令多此一举呢?请注意,重定向后控制台就没有输出了哦~ tee 命令的好处就在这里!本地分析res.txt文件,这时发现日志里有同一个ip的大量登录记录。其中被破解的帐号也只尝试了区区三百多次就爆出来了,看来弱口令真害死人啊!
为了检查是否还有别的帐号被破解,只需要提取登录成功的日志记录即可,vsftp中记录登录成功的信息是“OK LOGIN”,再借助 grep 命令,可以达到要求:
cat file | grep "OK LOGIN" | tee res.txt
分析结果文件,倒是发现不少记录,不过还好基本都是可信任地址,看来只有那一个帐号被破解了,暂时不用担心~
关于grep,后面的表达式可以是一个正则表达式,不过一般情况下都是简单的字符串,注意这个命令是可以组合的,例如我想查找十月份登录成功的记录,则执行:
cat file | grep "Oct" | grep "OK LOGIN" | tee res.txt
有人可能已经看出来了,如果这个“Oct” 和 “OK LOGIN”在文件中是相邻位置的话 自然可以放到一起,但是熟悉日志文件格式的朋友肯定也知道,这两个关键字明显不会连续,所以需要两个grep组合查询。
另外,如果不想把检索结果输出到控制台,可以直接执行:
grep "Oct" file | grep "OK LOGIN" > res.txt
利用重定向输出到文件即可,注意两个grep的匹配串一般没有先后顺序,当然如果如某个条件能快速缩小文件范围,建议放前面~
最后再说说日志文件排序,在apache的日志目录下有许多虚拟主机的日志文件,有大有小,如果我想看具体文件大小,简单的 ls 可是不行的,需要执行:
du -m *
即可看到每个文件的大小,但有一个问题,那就是这些日志文件是没有排序的,如果想按照从小到大或者从大到小排序那该怎么办呢,利用管道和 sort 吧:
du -m * | sort
执行之后,有人可能会说,这还是没排序的呀,如果你要这么说,那便是你错了!因为 sort 命令默认按照文件第一个域的ASCII值排序,因为 du -m * 得到的结果是:文件大小 文件名,注意这个”文件大小“在文本文件中可是字符型的,sort按照默认方式排序,当然比较ASCII值了~所以,我们需要指定排序方式,参数 -n 即可达到要求,指定按照数值类型排序,然后参数 -r 表示从大到小,忽略则表示从小到大,好了,再执行:
du -m * | sort -r -n
再执行,是不是你要的结果呀~!
更多推荐
所有评论(0)