2017-05-08 201 views
8

我有一個IP範圍表,我需要生成一個拒絕特定國家的網絡列表。從MySQL的IP範圍中選擇CIDR

所以我可以使用這個從我的數據庫生成一個IP範圍列表。

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

其產生這樣的結果

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

但是我需要輸出CIDR格式和有時的範圍將超過一個返回行這樣的。

1.0.1.0/24 
1.0.2.0/23 

有沒有什麼辦法可以使用select語句動態生成它們?這個語法很棒,但是我假設它必須是一個存儲過程,如果它要爲每個輸入行返回多個輸出行。

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

爲什麼downvote?你的理由不起作用。我不是在尋找意見,這是一個簡單的數學問題,我需要幫助。 – jbrahy

+0

此對話可能有助於http://stackoverflow.com/questions/595748/is-there-way-to-match-ip-with-ipcidr-straight-from-select-query?rq=1 –

回答

3

這是一個python腳本來完成轉換。只需要將其轉換爲存儲過程即可。

Conversion from IP Range to CIDR Mask

+0

謝謝,這看起來很有幫助。 – jbrahy

+0

讓我們知道SP與Python進行比較的行數。 –