`
lixuanbin
  • 浏览: 137741 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用Bash和Python统计高频请求IP

阅读更多

一、问题描述

   对外服务的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

http://robbinfan.com/blog/11/anti-crawler-strategy

0
0
分享到:
评论

相关推荐

    Python-pyshPython增强的bash脚本

    4. **简化脚本**:通过引入Python的模块和库,可以大大减少Bash脚本的复杂性,特别是处理文件操作、网络请求、数据解析等任务时。 5. **提高效率**:Python的性能通常优于Bash,特别是在处理大量数据或执行复杂计算...

    Python-用于生成到目前为止绕过所有防病毒软件的Bash和Python脚本FUD

    标题中的“Python-用于生成到目前为止绕过所有防病毒软件的Bash和Python脚本FUD”揭示了一个涉及网络安全和恶意软件的话题。FUD是“Fear, Uncertainty, and Doubt”的缩写,在这里指的是“防病毒软件无法检测的”...

    Python-何用Python代替Bash脚本指南

    然而,随着Python的普及和功能增强,越来越多的开发者开始考虑使用Python来替代Bash脚本。Python提供了更强大的数据处理能力、更好的可读性和维护性,以及丰富的第三方库支持。下面,我们将深入探讨为何以及如何用...

    Python-bash命令和语法带你升级打boss

    在IT领域,尤其是在系统管理和自动化任务执行中,Bash(Bourne-Again SHell)是一种广泛使用的命令行解释器,它是Unix、Linux和macOS等操作系统中的默认shell。掌握Bash命令和语法对于提高工作效率至关重要,特别是...

    Python简单获取自身外网IP的方法

    本文将详细介绍如何使用Python语言通过第三方平台轻松获取本机的外网IP地址。 #### 基本原理 在互联网上,每个连接到公网的设备都有一个唯一的IP地址,它用于在网络中唯一标识该设备。获取外网IP地址通常有两种...

    纯真IP数据库使用 Python代码

    本文将详细介绍如何使用Python来操作纯真IP数据库,并进行IP地址的查询。 首先,你需要获取到最新的纯真IP数据库文件,通常是以`.dat`格式提供的。这个文件包含了IP地址范围和对应的地理位置信息。在Python中,我们...

    用于自动分析大型结构、功能和扩散磁共振成像数据的bash和python脚本系列.zip

    用于自动分析大型结构、功能和扩散磁共振成像数据的bash和python脚本系列.zip

    python:从excel中提取高频词生成词云

    本篇文章将深入探讨如何使用Python从Excel文件中提取高频词汇并创建词云图。 首先,我们需要导入必要的库。`pandas`是用于处理表格数据的强大库,而`openpyxl`或`xlrd`则用来读取Excel文件。对于词云的生成,我们将...

    Python-SUDO通过叫喊来执行bash命令

    总结来说,Python中通过`sudo`执行Bash命令主要依赖于`subprocess`模块,但涉及到权限提升时,需要考虑用户交互和安全性问题。在实际应用中,应尽可能避免频繁使用`sudo`,以减少潜在的安全隐患,并确保遵循最小权限...

    Python-BashInfinity是bash的一个现代的样板框架标准库

    这可能是通过Python脚本调用Bash Infinity,或者框架本身包含Python接口,使得Python和Bash之间能进行无缝交互。这样的集成可以利用Python的强大力量,同时保留Bash的灵活性和轻便性。 **7. niieani-bash-oo-...

    Python-用Bash编写漂亮的命令行程序

    在压缩包文件`bash_opts-master`中,可能包含了示例代码和教程,教你如何在Python中使用Bash来编写命令行工具。这些资源可能包括了如何设置Bash选项,如何与Python脚本交互,以及如何优化命令行输出的示例。通过学习...

    Python3 执行Linux Bash命令的方法

    和之前C++执行Linux Bash命令的方法 一样,Python依然支持system调用和popen()函数来执行linux bash命令。 方法一:system调用 #仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 import os os....

    bashlex:用于 bash 的 Python 解析器

    bashlex 是 GNU bash 内部使用的解析器的 Python 端口。 在大多数情况下,它是从 C 音译而来的,主要区别在于: 它不执行任何操作 它是可重入的 它生成一个完整的 AST 安装: $ pip install bashlex 用法 $ ...

    Python-bashpy用于Python的内联Bash脚本运行器

    `bash.py` 是一个Python库,它允许用户在Python程序中直接运行Bash shell命令,无需通过系统调用或者使用子进程。这个库为Python开发者提供了一个方便的接口,可以无缝地执行Bash脚本或单个命令,使得在Python环境中...

    Python-Python的HTTP请求

    在Python中,我们可以使用内置的`urllib`库进行基本的HTTP请求,但这个库的使用相对复杂。相比之下,`requests`库提供了一个更简洁、更易用的API,使得开发者可以快速地发送HTTP请求并处理响应。 `requests`库的...

    Python-bash3boilerplate让你可以编写出更好Bash脚本的模板

    这个项目的核心理念是将Python的开发规范和最佳实践应用到Bash脚本中,提升脚本的可读性和可维护性,尤其对于那些在日常工作中频繁使用Bash但又希望保持代码整洁的程序员来说,这是一个非常有价值的资源。...

    Python-PostMail一个简单的邮件服务器可以让你发送一个邮件只发送一个POST请求

    Python-PostMail是一个轻量级的邮件服务器,它允许开发者通过发送HTTP POST请求的方式来实现电子邮件的发送...通过学习和使用PostMail,你不仅能掌握Python的电子邮件处理,还能了解到如何构建简单的RESTful API服务。

    scripts:我的Bash和Python脚本的集合,可简化各种任务

    我的bash和python脚本的集合。 工作正在进行中; 考虑到要简化的任务,我打算添加更多脚本! 入门 1.搭建环境 我在Linux环境(WSL 2 Ubuntu 20.04)中编写和使用这些脚本。 我希望他们也能在MacOS上工作。 对于...

    Python脚本项目源码-根据IP地址查对应的地理信息

    这个项目源码专注于使用Python来实现一个功能:根据输入的IP地址查询其对应的地理信息。这一功能通常被称为“IP定位”,它在网络安全、数据分析、广告定向等多个领域都有广泛应用。 首先,我们要了解IP地址与地理...

    Python-通过ARIN搜索公共IP所有者

    在Python中,我们可以使用requests库来发送这些请求。首先安装requests库: ```bash pip install requests ``` 接下来,我们需要了解如何构造API请求。通常,查询IP所有者的API请求URL可能如下所示: ```python ...

Global site tag (gtag.js) - Google Analytics