python进行tcpdump抓包

1 python进行tcpdump抓包

使用tcpdump抓包需要使用子进程进行操作比较好,不影响其他主代码逻辑,主要思路总结如下:

  • 开启抓包:使用 self.tcpprocess = subprocess.Popen(cmd1),将tcpdump命令传入cmd命令内;
  • 停止抓包:直接将tcpprocess kill即可:self.tcpprocess.kill();
import sys
import time
import datetime
class TcpDumpUtils():
    def __init__(self, dumpName = './log/', arguments=None):
        self.dumpFilePath = dumpName
        self.fileName = 'test'
        if arguments is not None:
            for argob in arguments:
                if arguments[argob] is True:
                    self.fileName += str(argob) + '_'
        ####随机产生一个时间戳
        startTime = datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')
        self.fileName += startTime + ".pcag"
		
    ####开启抓包
    def startTcpdumpWithFile(self):
        import subprocess
        #p = subprocess.Popen('tcpdump -i any -s 0 tcp -w ./ding.pcapng', shell=True)
        cmd1 = ['tcpdump', '-i', 'any', '-s', '0', 'tcp', '-w', self.dumpFilePath + self.fileName]
        self.tcpprocess = subprocess.Popen(cmd1)
        return self.tcpprocess

    ####停止抓包
    def stopTcpdumpWithFile(self):
        time.sleep(2)
        self.tcpprocess.kill()

    def tcpdump():
        import subprocess, fcntl, os
        # sudo tcpdump -i eth0 -n -s 0 -w - | grep -a -o -E "Host: .*|GET /.*"
        cmd1 = ['sudo','tcpdump', '-i', 'en0', '-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

    @staticmethod
    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 += str(line)
            except IOError:
                print
                'data empty...'
                pass
            break
        return txt
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值