一、问题描述
对外服务的Web系统有时候会遭到黑客的DDoS攻击,或者是被第三方软件爬取页面窃取服务,因此需要查找统计出高频请求的来源IP,以便后续处理。
二、处理思路
为避免打草惊蛇,先对最近一段时间内的HTTP服务器日志以及Servlet容器的日志进行静态分析统计,过滤掉合法请求来源后降序展示出统计结果,然后再人工锁定可疑IP。
由于计算量不大,可以使用bash shell命令以及python对日志文件进行统计。如果日后计算量剧增再考虑使用Hadoop MapReduce进行并行处理。
三、具体实现
1.使用grep查找出所有请求IP:
grep -r -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" WebLog*
-r是递归搜索
-E选项表示使用grep扩展的正则表达式
-o选项是只显示匹配到的字符串
输出结果形如:
log_file_name:ip_addr
2.使用python统计ip请求次数:
import sys ipMap = {} ipFilters = ("10.", "172.") def isFiltered(inIp): for ip in ipFilters: if inIp.startswith(ip): return True return False for line in sys.stdin: line = line.strip() if line: words = line.split(":") if words and len(words) > 1: if isFiltered(words[1]): continue elif ipMap.get(words[1]): ipMap[words[1]] += 1 else: ipMap[words[1]] = 1 for (key, value) in ipMap.items(): print "%-16s %d" % (key,value)
从标准输入流中按行读取数据,过滤掉白名单中的数据,然后放到字典中进行计数,最后把统计结果打印到标准输出流。
3.使用sort进行降序排序:
sort -k 2 -n -r
-k是选取第二列进行排序
-n是使用数字排序,不然会出现9比10大的情况
-r是降序,默认是升序
4.输出前N条记录:
head -n N
5.综合:
grep -r -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" WebLog* | python ipcount.py | sort -k 2 -n -r | head -n 20
从100M+的日志文件夹中得出统计结果所需时间在10秒以内,效果还算可以接受。
6.其实也可以全部用bash命令来实现:
grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" WebLog* | awk '{split($1,a,":");print a[2]}' | sed '/172\..*$/d' | sed '/10\..*$/d' | sort | uniq -c | sort -nr | head -n 20
四、参考资料:
http://www.jbxue.com/LINUXjishu/24950.html
http://www.2cto.com/os/201308/236418.html
http://sjolzy.cn/Python-built-in-string-handling-functions-order.html
http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/
http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html
http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
相关推荐
用于生成到目前为止绕过所有防病毒软件的Bash和Python脚本[FUD]
用于自动分析大型结构、功能和扩散磁共振成像数据的bash和python脚本系列.zip
何用Python代替Bash脚本指南
pysh:Python增强的bash脚本,允许您编写bash脚本,其中包含Python代码的短片段以及在bash和Python之间共享的本地环境。
bash命令和语法--带你升级打boss
和之前C++执行Linux Bash命令的方法 一样,Python依然支持system调用和popen()函数来执行linux bash命令。 方法一:system调用 #仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 import os os....
SUDO - 通过叫喊来执行bash命令
bash_shell笔记_1_脚本基础知识
bashlex 是 GNU bash 内部使用的解析器的 Python 端口。 在大多数情况下,它是从 C 音译而来的,主要区别在于: 它不执行任何操作 它是可重入的 它生成一个完整的 AST 安装: $ pip install bashlex 用法 $ ...
我的bash和python脚本的集合。 工作正在进行中; 考虑到要简化的任务,我打算添加更多脚本! 入门 1.搭建环境 我在Linux环境(WSL 2 Ubuntu 20.04)中编写和使用这些脚本。 我希望他们也能在MacOS上工作。 对于...
Bash Infinity是bash的一个现代的样板/框架/标准库
有bash shell和python两种语言混合开发。交互模式,可以提示用户输入创建数据库相关的信息,自动帮您生成建库脚本。之所以使用方便,是因为完全省去了人工换算表空间容器页大小,页数量换算操作,而且自动处理buffer...
bash.py - 用于Python的内联Bash脚本运行器
本文实例讲述了python和bash统计CPU利用率的方法。分享给大家供大家参考。具体如下: 开始的时候写了一个 bash 的实现; 因为最近也在学习 python ,所以就尝试着用 python 再实现一回; 支援 python2 环境; 请各位...
用Bash编写漂亮的命令行程序
使用 Google URL Shortner 服务缩短 URL 的脚本(在 Bash 和 python 中) 首先,您需要一个 Google URL Shortner API 密钥,按照此处的说明获取: : 生成服务器应用程序密钥并将其放入脚本文件。 要使用脚本,只需...
Bash和 Python是大多数自动化工程师最喜欢的编程语言。它们都各有优缺点,有时很难选择应该使用哪一个。所以,最诚实的答案是:这取决于任务、范围、背景和任务的复杂性。 让我们来比较一下这两种语言,以便更好地...
VASP脚本使用脚本语言(Bash 和 Python)简化多个 VASP 模拟作业的准备、提交和分析。笔记由于该项目的特定工作流相关性质,它对大多数 VASP 用户没有也可能不会有太大用处。 既然已经到了适合我自己研究需要的程度...
如何使用 python 的 unittest 进行 bash 单元测试的最小工作示例 从python调用bash脚本并使用unittest进行单元测试的原理可以应用于其他语言/单元测试框架对。 运行脚本 src/hello.sh 运行示例单元测试 python -m ...