Python Lambda与Scapy一起使用

Python Lambda与Scapy一起使用,python,lambda,network-programming,scapy,Python,Lambda,Network Programming,Scapy,我是Python新手,在使用Scapy进行ICMP ping扫描时遇到过lambda函数的使用。我已经阅读了一些教程,但我正在努力理解正确使用代码的概念 我试图弄清楚lambda参数是如何引用Scapy给出的输出的;主要是“s”和“r”的功能,以及它们如何使用“%IP.src%”直接从IP字段中拉出数据 def icmp_ping(target_ip): "Function for a classic ICMP Ping sweep." ans,unans=sr(IP(dst=targe

我是Python新手,在使用Scapy进行ICMP ping扫描时遇到过lambda函数的使用。我已经阅读了一些教程,但我正在努力理解正确使用代码的概念

我试图弄清楚lambda参数是如何引用Scapy给出的输出的;主要是“s”和“r”的功能,以及它们如何使用“%IP.src%”直接从IP字段中拉出数据

def icmp_ping(target_ip):
"Function for a classic ICMP Ping sweep."
    ans,unans=sr(IP(dst=target_ip)/ICMP(), timeout=3)
    ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive") )
    ans.summary(lambda (s,r): r.sprintf("%IP.ttl% is the TTL value") )
    print(ans)
它给出了输出:

Received 3 packets, got 1 answers, remaining 10 packets
192.168.0.100 is alive
64 is the TTL value
[(<IP  frag=0 proto=icmp dst=192.168.0.100 |<ICMP  |>>, <IP  version=4L ihl=5L tos=0x0 len=28 id=30394 flags= frag=0L ttl=64 proto=icmp chksum=0x820d src=192.168.0.100 dst=192.168.0.101 options=[] |<ICMP  type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |<Padding  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>)]
收到3个数据包,得到1个答案,剩余10个数据包
192.168.0.100还活着
64是TTL值
[(, )]

希望这个问题有意义

ans具有包含发送和接收数据包的元组。Lambda接受这个元组。您正在伸出接收到的数据包的IP头并写入源地址。在python3中,您必须编写以下内容

 ans.summary(lambda p: p[1].sprintf("%IP.src% is alive"))

在Python3中,参数以元组的形式出现,您必须通过其索引到达接收包

,似乎我已经设法弄明白了。lambda功能等同于ans中s,r的
code
功能:
code
,其中s=send,r=receive。然后使用sprintf提取所需的数据。