2011-09-24 9 views
6

के साथ एक आईपी रेंज पिंग करना मैं एक पायथन स्क्रिप्ट लिखने का प्रयास कर रहा हूं जो कि आईपी के ऑनलाइन होने के लिए एक आंतरिक आईपी रेंज पिंग करने के लिए स्कापी मॉड्यूल का उपयोग करता है। मैं इस मिल गया है अब तक:स्कैपी

#!/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 + सीआई के साथ इसे मारने के एक त्रुटि संदेश मिलता है:

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' 

लेकिन अगर मैं इसे एक आईपी पते के साथ कोशिश करता हूं, एक सीमा के बजाय, यह काम करता है। इस तरह:

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

कोई भी जानता है कि मैं इस समस्या को कैसे ठीक कर सकता हूं? या क्या आपके पास कोई अन्य विचार है कि मैं स्कैपी के साथ आईपी रेंज कैसे पिंग कर सकता हूं, यह निर्धारित करने के लिए कि कौन से होस्ट ऑनलाइन हैं?

+0

आपकी समस्या को उत्तर देने के लिए 'sr1 (पैकेट) 'के वापसी मूल्य को असाइन करने के साथ करना है। मैं 'scapy' से परिचित नहीं हूं इसलिए मैं उससे अधिक सहायता नहीं दे सकता, लेकिन वहां से शुरू कर सकता हूं। – brc

उत्तर

5

तुम बस यह सुनिश्चित करें कि replyNoneType जैसा कि नीचे बताया नहीं है जरूरत है ... 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 
+0

पैकेट नहीं करेगा [आईपी]। एसआरसी स्रोत आईपी मुद्रित करें यानी यदि आप 10.1.1.1 से 10.1.1.7 तक पिंग कर रहे हैं और यह विफल हो जाता है - उत्तर "10.1.1.1.1 के लिए टाइमआउट प्रतीक्षा" के बजाय "टाइमआउट प्रतीक्षा 10.1.1.1" होगा .1.7 "? –

+0

फिक्स्ड, इसे पकड़ने के लिए धन्यवाद –

2

आप reply.src क्षेत्र दिखाई नहीं दे सकते चर की वापसी रिक्त है। दूसरे शब्दों में, यदि आपको वैरिएबल कुछ मूल्य के साथ वापस आ गया है (यदि पिंग सफल था) तो आपको सत्यापित करने की आवश्यकता है। आप केवल .src फ़ील्ड प्राप्त करने के लिए IF स्थिति बना सकते हैं जब चर शून्य नहीं है।

संबंधित मुद्दे