- #!/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();