2011-09-24 9 views
6

Estoy intentando escribir un script de Python que use el módulo Scapy para hacer ping a un rango interno de IP para determinar qué IP están en línea. Tengo esto hasta ahora:Hacer ping en un rango de IP con Scapy

#!/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" 

y el programa sentarse un rato sin hacer nada, y luego, si lo mato con CTRL + CI aparece un mensaje de error:

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' 

Sin embargo, si Lo intento con una sola dirección IP, en lugar de un rango, funciona. De esta manera:

#!/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" 

¿Alguien sabe cómo puedo solucionar este problema? ¿O tiene alguna otra idea sobre cómo puedo hacer ping en un rango de IP con Scapy para determinar qué hosts están en línea?

+0

Su problema tiene que ver con la asignación del valor de retorno de 'sr1 (paquete)' a la respuesta. No estoy familiarizado con 'scapy' así que no puedo proporcionar más ayuda que eso, pero empiezo allí. – brc

Respuesta

5

Solo necesita asegurarse de que reply no es como se muestra a continuación ... sr1() devuelve None si obtiene un tiempo de espera esperando la respuesta. También debe agregar timeout a sr1(), el tiempo de espera predeterminado es bastante absurdo para sus propósitos.

#!/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 
+0

no empaquetaría [IP] .src imprimirá la IP de origen, es decir, si hace un ping de 10.1.1.1 a 10.1.1.7 y falla, la respuesta sería "Tiempo de espera esperando 10.1.1.1" en lugar de "Tiempo de espera esperando 10.1 .1.7 "? –

+0

Reparado, gracias por atrapar ese –

2

No se puede mostrar el campo reply.src si el retorno de la variable es nula. En otras palabras, debe validar si la variable ha regresado con algún valor (si el ping fue exitoso). Puede hacer una condición IF para obtener el campo .src solo cuando la variable no sea nula.

Cuestiones relacionadas