python呼叫tcpdump抓包過濾的方法

2022-10-04 19:15:08 字數 1534 閱讀 8836

之前在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...