电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python如何實時獲取tcpdump輸出

瀏覽:52日期:2022-07-11 09:57:15

一、背景

今天有個小需求,要確認客戶端有沒有往服務端發送udp包,但為了減輕工作量,不想每次到機器上手動執行tcpdump抓包命令。于是就寫了個腳本來釋放人力。

二、代碼實現

整個腳本我還加了一些其他功能:時間戳、發送端IP提取,數據包分析,數據持久化等。這里都先去掉,僅記錄下簡單的實時獲取tcpdump輸出功能。代碼如下:

# -*- coding: utf-8 -*-# !/usr/bin/env python# sudo tcpdump -tt -l -nn -c 5 -i enp4s0 udp port 514 or 51414import subprocesscmd = [’sudo’, ’tcpdump’, ’-tt’, ’-l’, ’-nn’, ’-c’, ’5’, ’-i’, ’enp4s0’, ’udp’, ’port’, ’514’, ’or’, ’51414’]proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)while True: line = proc.stdout.readline() line = line.strip() if not line: print(’tcpdump finished...’) break print(line)

輸出如下(實時):

wenyuanblog@localhost:/home/test/script# python tcpdump_udp.py tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on enp4s0, link-type EN10MB (Ethernet), capture size 262144 bytes1499774951.124178 IP 192.168.10.210.41974 > 192.168.10.251.514: UDP, length 1391499774953.125664 IP 192.168.10.210.54995 > 192.168.10.251.51414: UDP, length 1391499774956.128498 IP 192.168.10.210.56748 > 192.168.10.251.514: UDP, length 1391499774958.129918 IP 192.168.10.210.53883 > 192.168.10.251.51414: UDP, length 1391499774961.132921 IP 192.168.10.210.58803 > 192.168.10.251.514: UDP, length 1395 packets captured6 packets received by filter0 packets dropped by kerneltcpdump finished...

以上代碼相當于手動執行了 sudo tcpdump -tt -l -nn -c 5 -i enp4s0 udp port 514 or 51414 這條命令。注意參數-l很重要(行顯)。

三、代碼實現(更新)

上面的代碼能實現tcpdump的功能,但是有一個問題:沒有做超時保護。即當程序執行時間過長時kill該進程(這里使用ctrl+c的方式)。要實現這個功能有很多種方案,例如定時器+多線程等,這里僅演示一種方案,代碼如下:

# -*- coding: utf-8 -*-# !/usr/bin/env python# sudo tcpdump -tt -l -nn -c 50 -i enp4s0 udp port 514 or 51414import subprocessimport signalimport timeimport osimport reimport jsonclass CmdServer: def __init__(self, cmd, timeout=120): ’’’ :param cmd: 執行命令(列表形式) :param timeout: 任務超時時間(seconds,進程運行超過該時間,kill該進程) :param taskname: 任務名稱(根據該任務名稱記錄命令輸出信息) ’’’ self.cmd = cmd self.timeout = timeout self.base_path = reduce(lambda x, y: os.path.dirname(x), range(1), os.path.abspath(__file__)) self.output_path = os.path.join(self.base_path, ’data.json’) self.udp_flow_list = [] self.begin_time = int(time.time()) # 執行tcpdump任務 def run(self): if os.path.exists(self.output_path): with open(self.output_path, ’r’) as f:self.udp_flow_list = json.load(f) proc = subprocess.Popen(self.cmd, stdout=subprocess.PIPE) stdout = ’’ while proc.poll() == None: current_time = int(time.time()) if current_time - self.begin_time >= self.timeout:print(’tcpdump timeout...’)proc.send_signal(signal.SIGINT)stdout = proc.stdout.read() if proc.poll() is not None and not stdout: print(’tcpdump finished...’) stdout = proc.stdout.read() stdout_list = stdout.split(’n’) if stdout_list: self._merge_data(stdout_list) self._save_data() # 數據合并(新增/更新) def _merge_data(self, stdout_list): for line in stdout_list: line = line.strip() if not line:continue timestamp = int(float(line.split(’IP’)[0].strip())) * 1000 # 源 src_ip_port_list = re.findall(r’IP(.+?)>’, line) if not src_ip_port_list:continue src_ip_port_str = src_ip_port_list[0].strip() src_ip = ’.’.join(src_ip_port_str.split(’.’)[0:4]) # 目的 dst_ip_port_list = re.findall(r’>(.+?):’, line) if not dst_ip_port_list:continue dst_ip_port_str = dst_ip_port_list[0].strip() dst_port = dst_ip_port_str.split(’.’)[-1] # 新增/更新latest_timestamp src_item = filter(lambda x: src_ip == x[’src_ip’], self.udp_flow_list) if src_item:src_item[0][’dst_port’] = dst_portsrc_item[0][’latest_timestamp’] = timestamp else:self.udp_flow_list.append(dict( src_ip=src_ip, dst_port=dst_port, latest_timestamp=timestamp)) # 保存數據 def _save_data(self): # 寫入文件 with open(self.output_path, ’w’) as f: json.dump(self.udp_flow_list, f, encoding='utf-8', ensure_ascii=False)if __name__ == ’__main__’: cmd = [’sudo’, ’tcpdump’, ’-tt’, ’-l’, ’-nn’, ’-c’, ’5’, ’-i’, ’enp4s0’, ’udp’, ’port’, ’514’, ’or’, ’51414’] cmd_server = CmdServer(cmd, 10) cmd_server.run()

四、總結

比較簡單,僅僅是記錄下。

以上就是python如何實時獲取tcpdump輸出的詳細內容,更多關于python獲取tcpdump輸出的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 云南成人高考网| 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 【法利莱住人集装箱厂家】—活动集装箱房,集装箱租赁_大品牌,更放心 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 嘉兴泰东园林景观工程有限公司_花箱护栏 | 上海皓越真空设备有限公司官网-真空炉-真空热压烧结炉-sps放电等离子烧结炉 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 上海律师咨询_上海法律在线咨询免费_找对口律师上策法网-策法网 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 杭州成人高考_浙江省成人高考网上报名 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 无纺布包装机|径向缠绕包装机|缠绕膜打包机-上海晏陵智能设备有限公司 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 高空重型升降平台_高空液压举升平台_高空作业平台_移动式升降机-河南华鹰机械设备有限公司 | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 刚性-柔性防水套管-橡胶伸缩接头-波纹管补偿器-启腾供水材料有限公司 | 领先的大模型技术与应用公司-中关村科金 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 |