2011-09-24 21 views
6

Sto tentando di scrivere uno script Python che utilizza il modulo Scapy per eseguire il ping di un intervallo IP interno per determinare quali IP sono in linea. Ho questo finora:Ping di un intervallo 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" 

e il programma sedersi per un po 'non fare nulla, e poi se uccido con CTRL + CI ricevo un messaggio di errore:

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' 

Tuttavia, se Lo provo con un singolo indirizzo IP, invece di un intervallo, funziona. Come questo:

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

Qualcuno sa come posso risolvere questo problema? O avete altre idee su come posso eseguire il ping su un intervallo IP con Scapy, per determinare quali host sono online?

+0

Il tuo problema ha a che fare con l'assegnazione del valore di ritorno di 'sr1 (pacchetto)' per rispondere. Non ho familiarità con 'scapy' quindi non posso fornire più aiuto di quello, ma inizia da lì. – brc

risposta

5

Hai solo bisogno di garantire che reply non è NoneType come illustrato di seguito ... sr1() rendimenti None se si ottiene un timeout in attesa della risposta. Dovresti anche aggiungere uno timeout a sr1(), il timeout predefinito è abbastanza assurdo per i tuoi scopi.

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

non pacchetto [IP] .src stampa l'IP sorgente, ad esempio se esegui il ping da 10.1.1.1 a 10.1.1.7 e fallisce, la risposta sarebbe "Timeout in attesa di 10.1.1.1" invece di "Timeout in attesa di 10.1. .1.7" ? –

+0

Risolto, grazie per averlo capito –

2

Non si può mostrare campo reply.src se il ritorno della variabile è nulla. In altre parole, è necessario verificare se la variabile ha restituito un valore (se il ping ha avuto esito positivo). È possibile creare una condizione IF per ottenere il campo .src solo quando la variabile non è nulla.

Problemi correlati