先说下当时的需求,而且思路:
1.需求:需要扫描多个IP,把扫描结果保存到XML下。将XML下数据进行过滤,取出需要的数据打印出来。
2.目前难点:根据场景的不同,扫描出来的结果差异无比的大,例如每次结果都有差距。偶尔会冒出一些不懂的字段。为此很伤脑筋。
3.自己写出来的Perl代码:自己写的代码有点烂,可能学得不太好。Perl能够读取XML的节点,但是一旦扫多个IP,节点就会有变化。
当时使用的模块有很多问题,对此无比的尴尬。一开始摸索的模块是这个:XML::Simple 这是一个XML专门的处理模块。
贴上刚开始写的代码:
#!/usr/bin/perl use XML::Simple; use Data::Dumper; my $simple=XML::Simple->new(); my $data=$simple->XMLin('wai.xml'); #print Dumper($data)."\n"; print "-----------------------------------------------------\n"; print "创建时间:".$data->{startstr}."\n"; print "Ip地址:".$data->{host}->{address}[0]->{addr}."\n"; print "mac地址:".$data->{host}->{address}[1]->{addr}."\n"; print "主机名称:null\n"; print "主机状态:".$data->{host}->{status}->{state}."\n"; print "操作系统名称:".$data->{host}->{os}->{osclass}->{osfamily}."\n"; print "操作系统版本:".$data->{host}->{os}->{osclass}->{osgen}."\n"; print "操作系统补丁:".$data->{host}->{os}->{osmatch}->{name}."\n"; print "操作系统语言:null\n"; print "表更新时间:".$data->{runstats}->{finished}->{timestr}."\n"; print "服务总数量:".$data->{taskend}[3]->{extrainfo}."\n";
这就刚开始写的代码,比较纠结的问题来了,当扫描单个IP的时候,输出完全正常,但是在扫描多个节点的IP的时候,
根据场景的不同,输出结果就有很大的区别,对此甚是无奈,所以只能google搜索下解决的思路。
在后续找到一个脚本跟我的需求基本差不多,但是他使用的是sqlite3的数据库,而我目前准备使用的是mysql的数据库,
所以嘛,我得修改下。具体的代码请看上一篇文章,我做了个MARK。
接着我分析了下这个脚本使用的模块说明,无比蛋疼。。。没办法,英语不太好,所以我就google一个个单词翻译.
在此忽略了1晚上时间。。。具体说明文档在 http://search.cpan.org/~apersaud/Nmap-Parser-1.3/Parser.pm
感兴趣的童鞋可以自己移步去研究下。当然,我在这只是大概说下自己的分析思路。
接着放出最终解决问题的脚本(具体插库的那部分我删除了,你可以自己加),欢迎讨论和学习。。:)
use Nmap::Parser; use DBI; use Config::IniFiles; main: { if ($#ARGV == -1){ usage(); exit(1); } my $xmlfile=$ARGV[0]; nmap_info($xmlfile); } sub usage{ print "--------------------\n"; print "Usage: perl nmap.xml\n"; print "--------------------\n"; exit; } sub nmap_info{ local($file_name)=shift; my $np=new Nmap::Parser; $np->parsefile("$file_name"); my $session=$np->get_session(); for my $host ($np->all_hosts()){ if($host->addr eq undef){ $host_addr='null'; }else{ $host_addr=$host->addr; } if($host->status eq undef){ $host_status='null'; }elsif($host->status eq 'down'){ $host_status=1; }elsif($host->status eq 'up'){ $host_status=0; } if($host->hostname eq undef){ $host_hostname='null'; }else{ $host_hostname=$host->hostname; } if($host->mac_addr eq undef){ $host_mac_addr='null'; }else{ $host_mac_addr=$host->mac_addr(); } if($host->tcp_port_count eq undef){ $tcp_port_count='null'; }else{ $tcp_port_count=$host->tcp_port_count; } if($host->os_sig->osfamily eq undef){ $osfamily='null'; }else{ $osfamily=$host->os_sig->osfamily; } if($host->os_sig->osgen eq undef){ $osgen='null'; }else{ $osgen=$host->os_sig->osgen; } if($host->os_sig->name eq undef){ $os_name='null'; }else{ $os_name=$host->os_sig->name; } print "IP:",$host_addr,"\n"; print "状态:",$host_status,"\n"; print "主机名:",$host_hostname,"\n"; print "开始时间:",$session->start_str(),"\n"; print "结束时间:",$session->time_str(),"\n"; print "Mac地址:",$host_mac_addr,"\n"; print "服务数量:",$tcp_port_count,"\n"; print "系统名称:",$osfamily,"\n"; print "系统版本:",$osgen,"\n"; print "系统补丁版本:",$os_name,"\n"; } }