Проверка связи с диапазоном IP-адресов с помощью Scapy - PullRequest
7 голосов
/ 24 сентября 2011

Я пытаюсь написать скрипт Python, который использует модуль Scapy для проверки внутреннего диапазона IP-адресов, чтобы определить, какие IP-адреса находятся в сети. У меня есть это до сих пор:

#!/usr/bin/python
from scapy.all import *
conf.verb = 0
for ip in range(0, 256):
    packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
    reply = sr1(packet)
    if "192.168." in reply.src:
         print reply.src, "is online"

И программа будет сидеть некоторое время, ничего не делая, а затем, если я убью ее с помощью CTRL + C, я получу сообщение об ошибке:

Traceback (most recent call last):
File "sweep.py", line 7, in <module>
if "192.168." in reply.src:
AttributeError: 'NoneType' object has no attribute 'src'

Однако, если я попробую его с одним IP-адресом, а не с диапазоном, это сработает. Как это:

#!/usr/bin/python
from scapy.all import *
conf.verb = 0
packet = IP(dst="192.168.0.195", ttl=20)/ICMP()
reply = sr1(packet)
if "192.168." in reply.src:
    print reply.src, "is online"

Кто-нибудь знает, как я могу решить эту проблему? Или у вас есть другие идеи о том, как я могу пропинговать диапазон IP-адресов с помощью Scapy, чтобы определить, какие хосты находятся в сети?

Ответы [ 3 ]

6 голосов
/ 19 октября 2011

Вам просто нужно убедиться, что reply не равно NoneType, как показано ниже ... sr1() возвращает None, если вы получили тайм-аут ожидания ответа.Вы также должны добавить timeout к sr1(), тайм-аут по умолчанию довольно абсурден для ваших целей.

#!/usr/bin/python
from scapy.all import *

TIMEOUT = 2
conf.verb = 0
for ip in range(0, 256):
    packet = IP(dst="192.168.0." + str(ip), ttl=20)/ICMP()
    reply = sr1(packet, timeout=TIMEOUT)
    if not (reply is None):
         print reply.dst, "is online"
    else:
         print "Timeout waiting for %s" % packet[IP].dst
2 голосов
/ 21 апреля 2012

Невозможно отобразить поле reply.src, если возвращаемое значение переменной равно нулю. Другими словами, вам нужно проверить, имеет ли переменная возвращение с некоторым значением (если пинг прошел успешно). Вы можете выполнить условие IF, чтобы получить поле .src, только когда переменная не равна нулю.

0 голосов
/ 13 июля 2019

FTR, Scapy поддерживает неявные генераторы.Это работает:

ans, unans = sr(IP(dst="192.169.0.1-255")/ICMP(), timeout=2) 

Затем итерируйте ответы.

Возможно, это намного лучше

...