2009-12-21 10 views
10

से संभावित आईपी पते की एक सूची बनाएं मुझे पायथन (3.1) में एक फ़ंक्शन बनाने का कार्य सौंपा गया है जो एक सीआईडीआर नोटेशन लेगा और संभावित आईपी पते की सूची वापस कर देगा। मैं python.org चारों ओर देखा और यह पाया है: http://docs.python.org/dev/py3k/library/ipaddr.htmlपायथन 3: सीआईडीआर नोटेशन

लेकिन मैं कुछ भी है कि इस जरूरत को भरने जाएगा नहीं देखा है ... मैं बहुत आभारी के लिए किसी भी सहायता के किसी को भी मेरे रास्ते किक करने परवाह करता होगा। अग्रिम में धन्यवाद। :-)

+4

वापस जाएँ और अपनी प्रश्नों के कुछ उत्तर को स्वीकार करता है, तो वे मददगार थे करना चाहते हैं सकता है ... –

+0

मैं अजगर 2 पर इस्तेमाल किया है IPY (http://c0re.23.nu/c0de/IPy/)। एक्स, और अब इसे पायथन 3 पर पोर्ट करने की प्रक्रिया में हूं। एक बार जब मैं कर चुका हूं तो मैं एक लिंक के रूप में एक लिंक पोस्ट करूंगा। –

+0

@AJ: आईपी भी एक अच्छी पसंद है, लेकिन मैंने netaddr की सिफारिश की क्योंकि मुझे यह बेहतर पसंद है। :) – jathanism

उत्तर

1

क्या आपने iptools चेक आउट किया है? ऐसा लगता है कि यह काफी अच्छा फिट है।

+0

यह देखते हुए कि यह पाइथन 2.3 का समर्थन नहीं करता है, इसे शायद पाइथन 3.1 का समर्थन करने के लिए कम से कम एक मामूली प्रयास की आवश्यकता होगी। – ephemient

+2

मैंने पायथन 2.3, 2.5, 2.6 और 3.1 का समर्थन करने के लिए iptools को अद्यतन किया है। – bd808

0

यह दस्तावेज में नहीं है, लेकिन स्रोत ब्राउज़ कर पता चलता है कि ipaddr लागू करता __iter__ और iterhosts, जो कि आप क्या चाहते हैं।


एर, कभी नहीं।

  1. ऐसा लगता है कि 0 बी3.1 बीटा में stdlib में जोड़ा गया था, लेकिन 3.1 आरसी द्वारा हटा दिया गया था।
  2. मैं मूल ipaddr.py से स्रोतों को देख रहा था, जो कि python.org पर प्रतिलिपि से अलग विकसित हुआ प्रतीत होता है।

आप बाद वाले को बंडल कर सकते हैं।

24

यदि आप अंतर्निहित मॉड्यूल का उपयोग करने के लिए विवाहित नहीं हैं, तो netaddr नामक एक प्रोजेक्ट है जो आईपी नेटवर्क के साथ काम करने के लिए उपयोग किया जाने वाला सबसे अच्छा मॉड्यूल है।

IP Tutorial पर एक नज़र डालें जो दर्शाता है कि यह नेटवर्क के साथ कितना आसान काम कर रहा है और उनके आईपी समझते हैं। सरल उदाहरण:

>>> from netaddr import IPNetwork 
>>> for ip in IPNetwork('192.0.2.0/23'): 
... print '%s' % ip 
... 
192.0.2.0 
192.0.2.1 
192.0.2.2 
192.0.2.3 
... 
192.0.3.252 
192.0.3.253 
192.0.3.254 
192.0.3.255 
0

नीचे कोड आईपी और सबनेट प्रदान करने पर आईपी की रेंज उत्पन्न करेगा। (255.255.255.0) की तरह CIDR संकेतन

from netaddr import * 

def getFirstIp(ipAddress,subnet): 
    ipBin = IPNetwork(ipAddress).ip.bits().split('.') 
    subBin = IPNetwork(subnet).ip.bits().split('.') 
    zipped = zip(ipBin,subBin) 
    netIdList = [] 
    for octets in zipped: 
    netIdList.append(''.join(str(b) for b in (map((lambda x: int(x[0])*int(x[1])),zip(list(octets[0]),list(octets[1])))))) 
    firstIp = '' 
    firstIp = '.'.join(str(int(oct,2)) for oct in netIdList) 
    return firstIp 


def getLastIp(ipAddress,subnet): 
    ipBin = IPNetwork(ipAddress).ip.bits().split('.') 
    subBin = IPNetwork(subnet).ip.bits().split('.') 
    #print ipBin 
    #print subBin 
    revsubBin = [] 
    for octets in subBin: 
    revB = ''.join('1' if(b == '0') else '0' for b in octets) 
    revsubBin.append(revB) 
    zipped = zip(ipBin,revsubBin) 
    netIdList = [] 
    for octets in zipped: 
    netIdList.append(''.join(str(b) for b in (map((lambda x: 0 if(int(x[0]) == 0 and int(x[1]) == 0) else 1),zip(list(octets[0]),list(octets[1])))))) 
    #print netIdList 
    lastIp = '' 
    lastIp = '.'.join(str(int(oct,2)) for oct in netIdList) 
    return lastIp 

def getRangeOfIps(firstIp,lastIp): 
    start= int(IPAddress(firstIp)) 
    end = int(IPAddress(lastIp)) 
    ipList = [] 
    for ip in range(start,end+1): 
    ipList.append(str(IPAddress(ip))) 
    return ipList 

def manipulateIP(): 
firstIp = getFirstIp(ipAddress,subnet) 
lastIp = getLastIp(ipAddress,subnet) 
ipList = getRangeOfIps(firstIp,lastIp) 
print ipList 
3

मैं एक बाहरी मॉड्यूल एक छोटे से गणित कर के बजाय स्थापित करने पसंद करेंगे विस्तार करें, कोई भी मेरे साथ एक ही स्वाद है?

#!/usr/bin/env python 
# python cidr.py 192.168.1.1/24 

import sys, struct, socket 

(ip, cidr) = sys.argv[1].split('/') 
cidr = int(cidr) 
host_bits = 32 - cidr 
i = struct.unpack('>I', socket.inet_aton(ip))[0] # note the endianness 
start = (i >> host_bits) << host_bits # clear the host bits 
end = start | ((1 << host_bits) - 1) 

for i in range(start, end): 
    print(socket.inet_ntoa(struct.pack('>I',i))) 
+0

ध्यान दें कि इसमें प्रसारण पता शामिल नहीं है, जो आप चाहते हैं कि हो सकता है या नहीं भी हो सकता है। इसे शामिल करने के लिए "अंत" की गणना करते समय '-1' निकालें। – Peter