2015-04-22 63 views
2

我想抓取並打印ping請求的源地址。 我有以下腳本:Python scapy顯示ping(回顯)請求的IP

pkt = sniff(filter="icmp", timeout =15, count = 15) 
if pkt[ICMP].type == '8': 
    print pkt[IP].src 

當數據包到達腳本崩潰,並

AttributeError:'list' object has no attribute 'type' 

然而Scapy的控制檯上,我可以清楚地看到,這存在!

>>>packet=IP()/ICMP()/"AAAAAA" 
>>>packet[ICMP].type 
8 
>>> 

任何想法??

我改變了測試的目的我的腳本如下(!):

ping localhost -c 3 

產生以下尷尬的結果:

packet arrived 
127.0.0.1 
packet arrived 
127.0.0.1 
packet arrived 
packet arrived 
packet arrived 
127.0.0.1 
packet arrived 
127.0.0.1 
packet arrived 
packet arrived 
packet arrived 
127.0.0.1 
packet arrived 
127.0.0.1 
packet arrived 

pkts=sniff(filter="icmp", timeout=120,count=15) 

for packet in pkts: 
    if packet.haslayer(IP) and str(packet.getlayer(IP).src)=="127.0.0.1" 
     print "packet arrived" 
      if packet.haslayer(ICMP) and str(packet.getlayer(ICMP).type)=="8": 
       print(packet[IP].src) 

上面做了平之後

我們可以多次忽略「數據包到達」,因爲其他數據包到達我的主機湖但是當我發送3個迴應請求時,爲什麼我看到127.0.0.1的6倍?即使我刪除了for循環,也發生了相同的結果。

回答

1

您有多個數據包,使您可以索引或迭代:

from scapy.all import * 
pkts = sniff(filter="icmp", timeout =15,count=15) 

for packet in pkts: 
    if str(packet.getlayer(ICMP).type) == "8": 
     print(packet[IP].src) 

或者使用索引來獲得抗凍包:

from scapy.all import * 
pkts = sniff(filter="icmp", timeout =15,count=15) 

if pkts and str(pkts[0].getlayer(ICMP).type) == "8": 
     print(pkts[0][IP].src) 
+0

這裏我沒有使用[0]雖然..和同樣的事情正在發生http://www.picpaste.com/pics/icmp_problem-g3q981FT.1429788898.png – user3124171

+0

添加一個'print(pkts.summary() )'在循環之前,然後告訴我什麼不匹配 –

+0

LOL。這很有趣...這裏有一個明顯的問題... 這是一個scapy中的錯誤? http://www.picpaste.com/pics/scapy_hmmm_-IKNMgx5i.1429789818.png http://www.picpaste.com/pics/ICMP_LOL-VC2psSk5.1429789532.png 它看起來像它重複的條目莫名其妙...你可以從我的tcpdump中看到(這肯定不是騙人的),我發送了3個請求,並且有3個響應回來了...... scapy在哪裏顯示它們2次...你認爲怎麼樣? – user3124171

1

什麼sniff()的回報是不是包的列表,即使你可以像遍歷列表一樣遍歷它。見下面的例子:

>>> from scapy.all import * 
>>> pkts = sniff(count = 15) 
>>> pkts 
<Sniffed: TCP:4 UDP:4 ICMP:0 Other:7> 
>>> pkts[TCP] 
<TCP from Sniffed: TCP:4 UDP:0 ICMP:0 Other:0> 
>>> 

如果sniff()僅返回數據包的列表,pkt[ICMP]在你的榜樣永遠不會成功。 pkt[ICMP]所做的是它檢索pkt中所有ICMP數據包的列表。

+0

感謝您的回覆。這實際上是有幫助的。但是爲什麼如果packet.haslayer(ICMP)和str(packet.getlayer(ICMP).type)==「8」: print(packet [IP] .src ) 產生重複結果?謝謝 – user3124171

+0

因爲當你ping本地主機時,你的源IP地址和目的IP地址都是127.0.0.1。因此,迴應請求和迴應回覆的源IP地址均爲「127.0.0.1」。 – wookie919

+0

但我也有一個if語句只選擇迴應請求 – user3124171