2013-06-20 20 views
7

İki CIDR adresi verildiğinde, 192.168.2.0/14 ve 192.168.2.0/32İki CIDR adresinin kesişip geçmediğini kontrol edin.

İki ip adresinin "python2.6" ile örtüşüp örtüşmediğini nasıl kontrol ederim?

Ben netaddr tabi tutulduğu ve bu 192.168.2.0 iki CIDR adresi için kontrol etmek

from netaddr import IPNetwork, IPAddress 
bool = IPAddress("192.168.2.0") in IPNetwork("192.168.2.0/14"): 

Ama nasıl tarafından CIDR adresi 192.168.2.0/14 olup olmadığını kontrol sağlar ??

Ben test için el altında netaddr yok bir başvuru :: How can I check if an ip is in a network in python

+0

Bilginize, 192.168.2.0/32 tek bir IP adresi (192.168.2.0), bir alt ağ olup. – slebetman

+0

Python'a özgü olmayan bir cevabı kabul eder misiniz? Bilgi için – slebetman

+0

Thnx. Python'a ihtiyacım var ama açıklaman işe yarayabilir. – AJRedDevil

cevap

8

:

>>> import ipaddr 
>>> n1 = ipaddr.IPNetwork('192.168.1.0/24') 
>>> n2 = ipaddr.IPNetwork('192.168.2.0/24') 
>>> n3 = ipaddr.IPNetwork('192.168.2.0/25') 
>>> n1.overlaps(n2) 
False 
>>> n1.overlaps(n3) 
False 
>>> n2.overlaps(n3) 
True 
>>> n2.overlaps(n1) 
False 
+0

Kütüphane istediğim şeyi yapar. – AJRedDevil

+0

Aynı kod IPv6 için de çalışıyor mu, yoksa sadece IPv4'ü destekliyor mu? – AJRedDevil

+0

IPv6 için çalışma. ipaddr.IPNetwork (':: 192.168.0.0/120') örtüşen (ipaddr.IPNetwork (':: 192.168.0.0/121')) 'True ve' ipaddr.IPNetwork ifadelerini döndürür (':: 192.168.4.0/120 ') .overlaps (ipaddr.IPNetwork (' :: 192.168.0.0/121 ')) 'false döndürür – falsetru

1

Eğer bulundu, ancak ben ilk ağın first ve last adres hem ikinci içerdiği olmadığını kontrol düşünüyorum:

net_1 = IPNetwork("192.168.2.0/14") 
net_2 = IPNetwork("192.168.2.0/32") 
if net_1.first in net_2 and net_1.last in net_2: 
    # do something 

btw, IPNetworkline 1102 bir __contains__ yöntemini tanımlar. Ama emin değilim line 1127 kırık değil? Bir hatayı test etmeli ve rapor etmelisiniz.

5

Örneğinizde 192.168.2.0/32 yalnızca bir adresi temsil etse bile, aslında CIDR'lerin aralıklarını temsil etmesini istediğinizi varsayalım. Ayrıca 192.168.2.0/14, 2'de olduğunu unutmayın. anlamsız, çünkü 14 bitlik önek üçüncü sekizliğe ulaşmıyor. Her neyse, bunu yapmanın birkaç yolu vardır. Bunları üst üste için, hep başka bir alt grubu olması gerektiğini fark olabilir:

def cidrsOverlap(cidr0, cidr1): 
    return cidr0 in cidr1 or cidr1 in cidr0 

Yoksa aralıkları üst üste için yani birinci aralığın en düşük adresi için eşit veya daha az olmalıdır fark olabilir İkinci aralığın en yüksek adresi ve tersi. Böylece: ipaddr kullanarak

def cidrsOverlap(cidr0, cidr1): 
    return cidr0.first <= cidr1.last and cidr1.first <= cidr0.last 

print cidrsOverlap(IPNetwork('192.168.2.0/24'), IPNetwork('192.168.3.0/24')) 
# prints False 

print cidrsOverlap(IPNetwork('192.168.2.0/23'), IPNetwork('192.168.3.0/24')) 
# prints True 
+0

Aralık karşılaştırma çalışmaları için teşekkürler. Bir şey daha, örtüşen ip adreslerini bulabilir misiniz ?? – AJRedDevil

+2

Üst üste gelen ip adresleri, daha küçük aralığa sahip alt ağdır: yani '/' sonra daha yüksek sayı. Bu nedenle, 192.168.2.0/23 ve 192.168.2.0/24 arasında çakışan adresler 192.168.2.0/24'dir. Unutmayın, CIDR alt ağı "üst üste" olamaz. Sadece daha küçük bir CIDR alt ağı içerebilir veya olmayabilirler. – slebetman

+0

@AJRedDevil Biri her zaman diğerinin bir alt kümesi olduğundan, üst üste binme yalnızca küçük aralıktır. Üst üste binen ilk adres (daha küçük aralık) 'max (cidr0.first, cidr1.first)' dır. Son adres ise min (cidr0.last, cidr1.last) 'dir. –

İlgili konular