• python调用tcpdump抓包过滤


    之前在linux用python脚本写一个抓包分析小工具,实在不想用什么libpcap、pypcap所以,简单来了个tcpdump加grep搞定。基本思路是分别起tcpdump和grep两个进程,进程直接通过pipe交换数据,简单代码例如以下:

    #! /usr/bin/python
    
    def tcpdump():
    	import subprocess, fcntl, os
    	# sudo tcpdump -i eth0 -n -s 0 -w - | grep -a -o -E "Host: .*|GET /.*"
    	cmd1 = ['tcpdump', '-i', 'eth0', '-n','-B', '4096','-s', '0', '-w', '-']
    	cmd2 = ['grep', '--line-buffered', '-a', '-o', '-E', 'Host: .*|GET /.*']
    	p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
    	p2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE, stdin=p1.stdout)
    	
    	flags = fcntl.fcntl(p2.stdout.fileno(), fcntl.F_GETFL)
    	fcntl.fcntl(p2.stdout.fileno(), fcntl.F_SETFL, (flags | os.O_NDELAY | os.O_NONBLOCK))
    	return p2
    
    
    def poll_tcpdump(proc):
    	#print 'poll_tcpdump....'
    	import select
    	txt = None
    	while True:
    		# wait 1/10 second 
    		readReady, _, _ = select.select([proc.stdout.fileno()], [], [], 0.1)
    		if not len(readReady):
    			break
    		try:
    			for line in iter(proc.stdout.readline, ""):
    				if txt is None:
    					txt = ''
    				txt += line
    		except IOError:
    			print 'data empty...'
    			pass
    		break
    	return txt
    
    
    proc = tcpdump()
    while True:
    	text = poll_tcpdump(proc)
    	if text:
    		print '>>>> ' + text
    

    执行效果:



    当中值得注意tcpdump中'-B', '4096'这个參数。官方文档貌似没有明白提及,可是它是你解决丢包的关键地方之中的一个。当然还有-s这个參数也得好好利用!

    其它的大家能够自由发挥。


    转载请注明:http://blog.csdn.net/wangqiuyun/article/details/46966839

  • 相关阅读:
    安装Hadoop单机版
    Linux的en33没有IP地址
    idea导入spring源码
    CSS 选择器之基础选择器
    CSS 简介和代码风格
    JavaScript 中 双感叹号 !! 的作用
    VS Code 中的settings.js 配置
    项目中使用 vuex 实现(状态)数据共享
    VS Code 相关设置
    Node.js 的简单了解
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6993690.html
Copyright © 2020-2023  润新知