2015-04-22 3 views
2

Я хочу захватить и распечатать адрес источника запросов ping. У меня есть следующий сценарий:Python scapy show ip запросов ping (echo)

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 
>>> 

Любые мысли ??

я изменил для целей тестирования моего сценария следующих (!):

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) 

Значение выше после выполнения пинга:

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 

Мы можем игнорировать «пакет прибыл» несколько раз, потому что другие пакеты достигают моего хоста, как привет л. Но почему я вижу 6 раз 127.0.0.1, когда я отправил 3 эхо-запроса? Даже если я удаляю цикл 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], так это то, что он извлекает список всех ICMP-пакетов в pkt.

+0

Спасибо за ваш ответ. Это было полезно на самом деле .. Но почему для пакета в pkts: , если пакет.haslayer (ICMP) и str (пакет.getlayer (ICMP) .type) == "8": print (packet [IP] .src) производит дублирующие результаты? Спасибо – user3124171

+0

Потому что, когда вы «ping localhost», ваш IP-адрес источника и назначения «127.0.0.1». Таким образом, как эхо-запрос, так и эхо-ответ имеют IP-адрес источника 127.0.0.1. – wookie919

+0

, но у меня также есть оператор if для выбора только эхо-запросов – user3124171

Смежные вопросы