iT邦幫忙

12

用MySQL產生連續IP Address的方法

邦友們有討論用Excel產生IP Address的方法.
當然Excel有公式,可以搭配公式來拉,不過量一大可能拉的很辛苦.
也有邦友提出用VBA來產生.

敝人另外用MySQL來產生.
MySQL產生以後也可以轉成CSV,MySQL有CSV引擎,
可以轉過去用,或者產生成文字檔.
當然後續利用MySQL Table裡的資料,再搭配其他程式語言來開發
IP Address的管理程式,也是不錯的.
敝人之前有一篇http://ithelp.ithome.com.tw/question/10133871
產生測試資料的方法,可以利用.

-- 產生 Class C 192.168.0.1 跳5的IP Address
產生51筆資料.

CALL prc_filler(51);

SELECT COUNT(1) 
  FROM filler;

+----------+
| COUNT(1) |
+----------+
|       51 |
+----------+

產生 192.168.0.1 ~ 192.168.0.251 的IP 位址, 192.168.0.255 是不能使用的,用於廣播.

SELECT INET_NTOA(3232235521 + (id - 1) * 5) AS ip_address
  FROM filler;

+---------------+
| ip_address    |
+---------------+
| 192.168.0.1   |
| 192.168.0.6   |
中間省略
| 192.168.0.246 |
| 192.168.0.251 |
+---------------+

-- 產生 256個 Class C, 由1開始跳5的IP Address
將 filler清空
TRUNCATE filler;

產生256筆資料

CALL prc_filler(256);

建立一個Table來存放每段的起頭位址.

CREATE TABLE ipaddr(
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
ipaddr CHAR(15) NOT NULL
);

INSERT INTO ipaddr(ipaddr)
SELECT CONCAT('192.168.', CAST(id-1 AS CHAR(3) ), '.1')
  FROM filler;

將 filler清空
TRUNCATE filler;

產生51筆資料.
CALL prc_filler(51);

建立另一個Table 來存放更多IP Address
CREATE TABLE moreip(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
ipaddr CHAR(15) NOT NULL
);

INSERT INTO moreip(ipaddr)
SELECT INET_NTOA(INET_ATON(i.ipaddr) + (f.id - 1) * 5)
  FROM filler f
     , ipaddr i;

Query OK, 13056 rows affected (1.36 sec)

+-------+-----------------+
| id    | ipaddr          |
+-------+-----------------+
|  1    | 192.168.0.1     |
|  2    | 192.168.0.6     |
|  3    | 192.168.0.11    |
中間省略
| 13054 | 192.168.255.241 |
| 13055 | 192.168.255.246 |
| 13056 | 192.168.255.251 |
+-------+-----------------+

0
一級屠豬士
iT邦高手 1 級 ‧ 2014-01-10 23:29:08

轉成 CSV的方法,利用CSV引擎.

<pre class="c" name="code">CREATE TABLE csvip(
ipaddr CHAR(15) NOT NULL
)ENGINE=CSV;

INSERT INTO csvip(ipaddr)
SELECT ipaddr
  FROM moreip;

離開MySQL Client,到Shell下.
以root身份登入.
到MySQL的資料目錄,將csvip.CSV cp到需要的目錄下,
變更為適當的owner.
接著用試算表程式打開,例如敝人是用LibreOffice Calc打開.

圖形如下兩圖,每換新的Class C,就會由1開始起跳.

0
老鷹(eagle)
iT邦高手 1 級 ‧ 2014-01-11 00:17:45

厲害~~!

謝謝筆記

0
賽門
iT邦超人 1 級 ‧ 2014-01-11 11:34:06

小雨大變成猴大了。

洗溫泉的

這...看起來像便秘很久...突然吃了瀉藥的....偷笑

0
wiseguy
iT邦超人 1 級 ‧ 2014-01-11 22:40:34

提供 PHP 版:

<pre class="c" name="code">$id=1;
for ($i = ip2long('192.168.0.1'); $i<=ip2long('192.168.255.251'); $i++)
	if (!preg_match('/\.(0|255)$/', $ip=long2ip($i)))
		echo $id++, chr(9), $ip, chr(10);

喜歡筆記拍手謝謝

0
zuyan
iT邦好手 1 級 ‧ 2014-01-12 13:45:46

換成數字就容易存放了

W.X.Y.Z = W*2^24 + X*2^16 + Y*2^8 + Z

以前看別人都這樣處理的啊...

之前有邦友討論用Excel,是要跳5的.
請參考 http://ithelp.ithome.com.tw/question/10144635?tag=rt.hb
所以就分享用另外的途徑與方法來產生.
MySQL有 INET_ATON() ,與 INET_NOTA() 兩個函數,
故利用此兩函數.

<pre class="c" name="code">
INET_ATON() 就是將IP Address轉成整數,不需要再自己代公式.
SELECT INET_ATON('192.168.0.1');
+--------------------------+
| INET_ATON('192.168.0.1') |
+--------------------------+
|               3232235521 |
+--------------------------+

再增加整數值,可以再轉回IP Address, 例如將上面數值加1後轉回
IP Address.
SELECT INET_NTOA(3232235522);
+-----------------------+
| INET_NTOA(3232235522) |
+-----------------------+
| 192.168.0.2           |
+-----------------------+

上面的分享是利用之前產生測試資料的,配合此兩函數的應用.
若是連續的,會更簡潔.可以產生一堆連續的,再將廣播的刪除.

我要留言

立即登入留言