2017-05-08 21 views
8

IP Aralık'larım var ve belirli bir ülkeyi reddetmek için bir ağ listesi oluşturmam gerekiyor.IP Aralığı'ndan CIDR'yi MySQL içinde seçin

Bunu kullanarak db'mden bir ip aralığı listesi oluşturabilirim. Bu sonucu

ip_from  inet_ntoa(ip_from) ip_to  inet_ntoa(ip_to) 
16777472 1.0.1.0    16778239 1.0.3.255 

üretir Ama CIDR biçiminde olduğu çıktı ihtiyaç ve bazen aralık birden fazla satır böyle döndü olacaktır

SELECT 
     ip_from, 
     Inet_ntoa(ip_from), 
     ip_to, 
     Inet_ntoa(ip_to) 
FROM 
     ip_address_data 
WHERE 
     country_code = 'XX' 
LIMIT 1 

.

1.0.1.0/24 
1.0.2.0/23 

Belirli bir deyim kullanarak bunları dinamik olarak oluşturmak için herhangi bir yolu var mı? Bu sözdizimi harika olurdu, ancak giriş satırında birden fazla çıktı satırı döndürecekse, saklı bir yordam olması gerekeceğini farz ediyorum.

SELECT 
    CONCAT('/sbin/route add -net ', CONVERT_TO_CIDR(ip_from,ip_to), ' reject;') AS command 
FROM 
    ip_info.ip_address_data 
WHERE 
    country_code='XX' 
+1

neden downvote? Sebebi işe yaramıyor. Fikir aramıyorum, bunun için yardıma ihtiyacım olan basit bir matematik problemi. – jbrahy

+0

Bu konuşma, http://stackoverflow.com/questions/595748/is-there-way-to-match-ip-with-ipcidr-straight-from-select-query?rq=1 –

cevap

3

Dönüştürmeyi yapmak için bir python betiği. Bunu saklı bir prosedüre dönüştürmeniz yeterli.

Conversion from IP Range to CIDR Mask

+0

Yardımı'na yardımcı olabilir. . – jbrahy

+0

SP'nin Python ile kaç satırı karşılaştırdığını bize bildirin. –