先说下当时的需求,而且思路:
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";
}
}