【问题标题】:Filter pcap pap protocol without pyshark在没有 pyshark 的情况下过滤 pcap pap 协议
【发布时间】:2017-12-01 20:50:36
【问题描述】:

我想访问pap数据包中的数据,目前我正在使用pyshark,代码如下

import pyshark,sys

cap = pyshark.FileCapture('test.pcap',display_filter='ppp && not ppp.length')

for packet in cap:
        if packet.pap.get_field_value('peer_id'):
            print ('user: '+packet.pap.peer_id+" logged in")

它在我的电脑和 raspberrypi 上运行良好,不幸的是我想在 openwrt/lede 路由器上使用此代码,由于 ccache 错误而无法安装 pyshark:

unable to execute 'ccache_cc': no such file or directory

我认为 openwrt 缺少一些编译器功能,所以我尝试安装其他 pcap 解析库,并且可以安装 scapy、dpkt 和 pypcapfile,它们都安装得很好,所以我如何转换我的代码以使用这些库之一

【问题讨论】:

    标签: python scapy dpkt pyshark


    【解决方案1】:

    感谢@pierre,我发现 scapy 的开发版本有一些新的有用类(PPP_PAP 和 PPP_PAP_Request),所以我能够为我的问题编写一个工作代码,它可以在 python2 和 python3 中工作

    from scapy.all import PPP,PPP_PAP_Request,sniff
    
    def logusers(pkt):
            if PPP_PAP_Request in pkt:
                    print(pkt[PPP_PAP_Request].username.decode()+" logged in")
    sniff(count=0,offline='all.pcap',prn=logusers,filter="pppoes",store=0)
    

    我使用了嗅探功能,因为我发现它有点轻量级和快速(毕竟我正在尝试在嵌入式系统上运行代码)但是它仍然有点慢,我不知道是否有更快的东西(也许不是 scapy)所以我暂时不会接受这个答案

    【讨论】:

      【解决方案2】:

      使用Scapy(使用GitHub的开发版),你可以试试:

      from scapy.all import PcapReader, PPP_PAP_Request
      
      for pkt in PcapReader('test.pcap'):
          if PPP_PAP_Request in pkt:
              print(pkt.sprintf('user: %PPP_PAP_Request.username% logged in'))
      

      【讨论】:

      • 这对我不起作用,我不知道为什么数据包没有被检测为PAP_PAP,而是被检测为PPP,所以我将代码修改为from scapy.all import PcapReader, PPP_PAP,PPP for pkt in PcapReader('test.pcap'): if PPP in pkt: print(pkt) print(pkt.sprintf('user: %data% logged in')) 它工作,除了它不只打印用户名,它打印整个数据(带有一些字节数据的用户名)