- #!/usr/bin/perl -w
- ##################################### 函數 get_ip_array ##########################################
- ################## 輸入從www.5maila.com 上面搜索並下載的 文件名字
- ################# 輸出 從裏面找到的 ip地址段
- sub get_ip_array{
- $filename="$_[0]";
- open "file","$filename";
- my @nets;
- foreach $file_line (<file>){
- if ($file_line=~ /href=\'ip_(.*).htm/){
- $file_line_net = $1;
- push (@nets,$file_line_net);
- }
- else{
- next;
- }
- }
- return @nets;
- }
- ##################################函數 let_array_clear###########################################
- #################### 輸入一個含有若干ip地址的 數組
- #################### 輸出 同一個/24網絡裏面 只有 一個 ip地址 存在
- # 函數,讓數組 清楚一些
- sub let_array_clear{
- my @array = @_;
- my @new_array;
- my $ifsame = 0;
- foreach $array (@array) {
- #默認將 老數組中的每一個值跟 新數組中的任一個值都不同
- $ifsame=0;
- # 查詢新數組序列中的每一個值
- foreach $new_array (@new_array){
- #將新數組中的一個值 按照 小數點進行 分隔成4塊
- @new_array_numbers = split("\\.",$new_array);
- #將老數組中的一個值 按照 小數點進行 分隔成4塊
- @array_numbers = split("\\.",$array);
- #判斷數組4塊中的前三塊兒是否相同
- if ( $new_array_numbers[0] == $array_numbers[0] and $new_array_numbers[1] == $array_numbers[1] and $new_array_numbers[2] == $array_numbers[2] ){
- #若是相同,那麼就將是否相同 設置爲1
- $ifsame = 1;
- }
- }
- # 比對完成後,對結果 ifsame 進行判斷,若是相同,就進行下次循環,不然, 進行push操做
- if ($ifsame == 1) {
- next;
- }
- elsif ($ifsame == 0) {
- $new_array = $array;
- push (@new_array,$new_array);
- }
- }
- return @new_array;
- }
- ######################################## 鏈接數據庫 ####################################################
- use DBI;
- use DBD::mysql;
- my $dbh = DBI -> connect("DBI:mysql:db_iplocate;host=127.0.0.1", "admin","admin",{RaiseError=>1});
- my $sth = $dbh->prepare( q{select city_cn,city_en from `gps`}) or die("Cannot prepare statement:", $dbh->errstr(),"\n");
- my $rc = $sth->execute() or die("Cannot execute statement:", $sth->errstr(), "\n");
- # 初始化兩個數組 , 用來存放 從 數據庫中得出的 城市 中文名字 和 英文名字
- my @city_cn;
- my @city_en;
- # 將從mysql獲得的city_cn和city_en放到相應的數組中
- while (my @row = $sth -> fetchrow_array()){
- push @city_cn,$row[0];
- push @city_en,$row[1];
- }
- # 初始化兩個數組,用來存放 三個運營商的 中文名字 和 英文名字
- my @isps_cn = ("移動","聯通","電信");
- my @isps_en = ("ChinaMobile","ChinaUnicom","ChinaTelecom");
- # 對城市列表數組 進行 循環
- foreach $i(0..(@city_cn-1)){
- # 對 運營商數組 進行循環
- foreach $j(0..@isps_cn-1) {
- # 組合出英文文件名稱
- $file_name = "$city_en[$i]" . "_" . "$isps_en[$j]";
- # 開始處理
- print "開始處理$file_name......Ready!"
- # 1. 使用get_ip_array 的到 可能的ip地址段
- # 2. 使用let_array_clear 將獲得的 ip地址段 數組 清洗, 確保不重複
- my @result = &let_array_clear(&get_ip_array("$file_name"));
- # 初始化 $nmap_target
- $nmap_target = "";
- # 循環讀出 result數組中存在的目標網段, 並在結尾加上 /24並 合併
- foreach $result (@result){
- $nmap_target .= $result . "/24 ";
- }
- print `nmap -n -sP $nmap_target -oN result_nmap/$file_name`;
- print "處理$file_name......Complete!\n";
- }
- }
- warn($DBI::errstr) if $DBI::err;
- $dbh->disconnect();
- $sth->finish();