之前在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 whkhjr| 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這個引數也得好好利用!其他的大家可以自由發揮!
本文標題: python呼叫tcpdump抓包過濾的方法
本文位址:
python進行tcpdump抓包
使用tcpdump抓包需要使用子程序進行操作比較好,不影響其他主 邏輯,主要思路總結如下 import sys import time import datetime class tcpdumputils def init self,dumpname log arguments none self....
tcpdump如何抓界麵包 tcpdump抓包命令
一.選項 tcpdump支援相當多的引數,如使用 i引數指定tcpdump監聽的網路介面,這在計算機具有多個網路介面時非常有用,使用 c引數指定要監聽的資料報數量,使用 w引數指定將監聽到的資料報寫入檔案中儲存,等等。如下 a 將網路位址和廣播位址轉變成名字 b 在資料 鏈路層上選擇協議,包括ip ...
python呼叫其他程式 python呼叫其他程式
在python中可以方便地使用os模組執行其他的指令碼或者程式,這樣就可以在指令碼中直接使用其他指令碼,或者程式提供的功能,而不必再次編寫實現該功能的 為了更好地控制執行的程序,可以使用win32process模組中的函式。如果想進一步控制程序,則可以使用ctype模組,直接呼叫kernel32.d...