2011-09-24 23 views
6

Hangi IP'lerin çevrimiçi olduğunu belirlemek için bir iç IP aralığına ping yapmak için Scapy modülünü kullanan bir Python komut dosyası yazmayı deniyorum.Bir IP aralığını Scapy ile Ping

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

Ve programın hiçbir şey yapmadan bir süre oturup, sonra CTRL + CI ile öldürmek eğer bir hata mesajı: Ben şimdiye kadar bu var Ancak eğer

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' 

Bir aralık yerine tek bir IP adresiyle denerim, çalışır. Bunun gibi:

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

Bu sorunu nasıl giderebileceğimi bilen var mı? Veya hangi ev sahiplerinin çevrimiçi olduğunu belirlemek için Scapy ile bir IP aralığına nasıl ping atabileceğim hakkında başka fikriniz var mı?

+0

Sorununuz, yanıt vermek için 'sr1 (paket)' dönüş değeri atanması ile ilgilidir. Ben 'scapy' ile aşina değilim, bu yüzden bundan daha fazla yardım sağlayamam ama oradan başla. – brc

cevap

5

Aşağıdaki şekilde gösterildiği gibi reply'un NoneType olduğundan emin olmanız yeterlidir ... sr1(), yanıtı beklerken bir zaman aşımı alırsanızdeğerini döndürür. Ayrıca sr1()'a timeout eklemelisiniz, varsayılan zaman aşımı sizin amaçlarınız için oldukça saçmadır. değişkenin dönüş null ise

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

paketi [IP] .src kaynak IP yazdırmaz, yani 10.1.1.1'den 10.1.1.7'ye ping yaparsanız ve başarısız olursa - yanıt "Zaman aşımı 10.1.1.1'i beklemek yerine" Zaman aşımı 10.1 bekleniyordu .1.7" ? –

+0

Sabit, bunu yakaladığın için teşekkürler –

2

Sen reply.src alanını gösteremez. Diğer bir deyişle, değişkenin bir değere sahip olup olmadığını doğrulamanız gerekir (eğer ping başarılı olursa). .src alanını yalnızca değişken boş olmadığında almak için bir IF koşulu yapabilirsiniz.