首页 > 编程语言 >python3使用libpcap给ESL命令添加日志记录

python3使用libpcap给ESL命令添加日志记录

时间:2023-11-25 20:11:45浏览次数:49  
标签:socket libpcap 示例 sock 获取 ESL python3

操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 python版本:3.9.12 libpcap版本:1.11.0b7   FreeSWITCH的ESL模块用起来很方便,可以控制FreeSWITCH实现具体业务需求,但该模块没有提供ESL命令执行日志,不便于排查问题,本文展示一种使用python3基于libpcap实现ESL命令执行日志的方法,并提供示例代码及相关资源下载途径。

一、背景描述

日常开发过程中观察到:通过ESL发送给FreeSWITCH的命令,在freeswitch.log中找不到记录。
查看代码发现,确实没有相关记录(mod_event_socket.c文件):
static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)

分析后发现,大概有以下几个方法:

  • 1、通过修改FreeSWITCH源代码实现
文件: mod_event_socket.c 入口: api_exec
可通过switch_log_printf函数来实现。
  • 2、使用tcpdump抓取
因EventSocket模块使用的是基于TCP的文本协议,且未加密,默认端口8021,可以通过tcpdump抓取event socket服务端口获取命令记录。

 示例如下:

tcpdump tcp dst port 8021 -w test1.pcap
  • 3、使用python3基于libpcap实现
底层原理和tcpdump一样,只是基于libpcap使用python3进行实现,会灵活很多,这也是本文终点描述的方法,具体实现在后续展开。

二、具体实现

本文基于python3.9.12实现,CentOS 7环境编译及使用python3.9.12,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/centos7-install-py39-20220704.html

关键点如下:
1、实时抓取网卡数据

可基于libpcap实时抓取网卡数据,具体可参考我之前写的文章:

https://www.cnblogs.com/MikeZhang/p/pythonUseLibpcap20221029.html

2、解析IP头获取源地址
需要获取发送ESL命令机器的源地址以便排查问题,IP数据包里面包含有源地址,python中解析IP头的示例如下:

ipInfo = struct.unpack('!BBHHHBBH4s4s',bytes(p[14:34]))
srcIp = socket.inet_ntoa(ipInfo[-2])
dstIp = socket.inet_ntoa(ipInfo[-1])

3、解析TCP头获取具体数据
具体的ESL命令在TCP的数据部分保存,可通过解析TCP头获取ESL数据的起始下标,进而获取数据,示例如下:

tcpInfo = struct.unpack('!HHLLBBH',bytes(p[34:50]))
tcpHdrLen = (tcpInfo[4] >> 4) * 4
offset = 34 + tcpHdrLen
data = bytes(p[offset:tlen])

4、使用logging模块进行记录
可使用python自带的日志模块记录ESL命令记录,并进行存盘,便于后续查看。

示例如下:

logger.info("(%s,%s)" % (srcIp,data))

logger可在main函数中实现,指定具体的存盘文件,如果只是想控制台查看,则可以这样实现:

logger = logging.getLogger()

...

logging.basicConfig(
    level=logging.DEBUG, # DEBUG,INFO,WARNING,ERROR,CRITICAL
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    datefmt='%a, %d %b %Y %H:%M:%S'
)

基于上述关键点,可以实现ESL命令的日志记录,示例如下(eslLogTest1.py):

完整代码可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20231125 获取。

三、运行效果

可使用ESL发送命令,然后用python脚本进行记录。发送ESL命令可使用ESL库,python3.9.12版本的ESL编译及使用,可参考这篇文章:
https://www.cnblogs.com/MikeZhang/p/py39esl-20230424.html

也可直接使用socket,示例如下(sendcmd1.py):
import socket,time

def doCmd(sock,cmd):
    print(cmd)
    sock.send(cmd + b'\r\n\r\n')

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.connect(('192.168.137.32', 8021))  
sock.send(b'auth ClueCon\r\n\r\n')
doCmd(sock,b'bgapi originate user/1000 &echo')
time.sleep(10)
doCmd(sock,b'bgapi hupall')
发送命令后,使用python实时记录的运行效果如下:

运行效果视频可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 2023112501 获取。

四、资源获取

本文涉及资源,可以从如下途径获取:

 关注微信公众号(聊聊博文,文末可扫码)后回复 20231125 获取。

好,就这么多了,希望对你有帮助。

标签:socket,libpcap,示例,sock,获取,ESL,python3
From: https://www.cnblogs.com/MikeZhang/p/pyESLCapLog20211125.html

相关文章

  • ubuntu黑屏(解决,但又没完全解决)关于双系统 ubuntu22.04 LST+win11 及 双显卡 AMD-6650X
    今天一开机,ubuntu系统就黑屏左上角光标一直闪,并且报了bluetooth的问题和v2raya的问题。alt+f2-f7都无法切换到命令界面或图形界面。但是反复重启后,有个别几次能进入图形界面。排查了几个原因1、内核的问题。参考:https://www.mail-archive.com/debian-bugs-dist@lists.debian......
  • 【最新最全指南】Vue项目安装eslint配置说明
    本指南都适配windows和mac下的开发项目第一步:安装1、全局安装:eslint(最好全局安装1个,配置出错debug方便)npminstalleslint-g2、项目本地dev安装:eslint(也可不安装,后面安装eslint-plugin-vue时候,默认会一起安装eslint)npminstalleslint-D3、项目本地dev安装插件:eslint-plu......
  • panjiachen的vue-admin-template中关闭eslint
    由于有语法检查,所以我想关闭eslint低版本:  在conf/index.js中将useEslint改为flase高版本:  在.eslintrc.js中有rules,这里边都是eslint的校验规则,如果你不想有校验,可以直接将rule括号中的规则都注释掉   ......
  • python3 chap1启航
    python3chap1启航1.单行注释#;多行注释'''或"""包裹(注释非常重要)2.基础的控制台输出f(x)print->调用函数;("……")->参数;"……"->字符串3.print()默认每次输入后会换行,如果不想换:末尾添加,end=""4.print()一次也可以多输多个内容("a","b&q......
  • Linux环境下Python3.10安装
    事件缘起我在Linux服务器(CentOS7.8)安装Python3.10,并替换python软链接为python3之后,yum命令不可用。特此记录一下。完整安装步骤如下:Python3.10安装1.使用yum程序提前安装Python依赖。yuminstallwgetzlib-develbzip2-developenssl-develncurses-develsqlite-devel......
  • Pwn2own 2022 Tesla 利用链 (ConnMan 堆越界写 RCE)
    Pwn2own2022Tesla利用链(ConnMan堆越界写RCE)Openingthedoorsandwindows0-clickRCEontheTeslaModel3HEXACON2022-0-clickRCEontheTeslaModel3byDavidBerard&VincentDehors漏洞分析ConnMan处理WIFIPortal时的堆越界写,这部分协议特性称作:WISP......
  • Centos7 使用yum从第三方仓库安装Python3.8
    环境:CentOSLinuxrelease7.9.2009起因:Centos7自带Python2.7.5版本。而默认的YUM安装的python3是3.6版本,遂升级到3.8版本。installPython3.8yuminstall-ycentos-release-scl#仓库注册yuminstall-yrh-python38which#安装python3.8#创建软连接ln-s/opt......
  • Linux环境下Python3.10安装
    事件缘起我在Linux服务器(CentOS7.8)安装Python3.10,并替换python软链接为python3之后,yum命令不可用。特此记录一下。完整安装步骤如下:Python3.10安装1.使用yum程序提前安装Python依赖。yuminstallwgetzlib-develbzip2-developenssl-develncurses-develsqlite-develr......
  • 洛谷B2017 打印 ASCII 码(Python3)
    要点:1.Python的input()默认要换行,而在输入的时候即使只输了一个字符,也会被判定为输入两个字符。故此处要么只取字符串的第一位,要么在输入时用.strip()来删去首位字符,strip的介绍在这里2.Python中不能用强制类型转换来得到ASCII码,需要用到ord()函数。ord():括号内的字符的ASCI......
  • 洛谷B2016 浮点数向零舍入(Python3)
    要点:1.有正有负怎么办?正负分开写?如果只看数字部分,那取整的方式是一样的。所以我们可以先输出符号,把问题全都转化到非负数集中。2.如何取整?此处取整为向下取整。而强制类型转换把浮点数转化为整型数的时候是把小数部分全部去掉,而不是四舍五入,与题中取整方式相符,故可直......