之前在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這個參數也得好好操作!其他的各人可以自由發揮!
,