生活随笔
收集整理的這篇文章主要介紹了
Perl Nmap报告处理摸索(学习)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先說下當時的需求,而且思路:
1.需求:需要掃描多個IP,把掃描結果保存到XML下。將XML下數據進行過濾,取出需要的數據打印出來。
2.目前難點:根據場景的不同,掃描出來的結果差異無比的大,例如每次結果都有差距。偶爾會冒出一些不懂的字段。為此很傷腦筋。
3.自己寫出來的Perl代碼:自己寫的代碼有點爛,可能學得不太好。Perl能夠讀取XML的節點,但是一旦掃多個IP,節點就會有變化。
當時使用的模塊有很多問題,對此無比的尷尬。一開始摸索的模塊是這個:XML::Simple 這是一個XML專門的處理模塊。
貼上剛開始寫的代碼:
#!/usr/bin/perluse 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";}} ?
轉載于:https://www.cnblogs.com/xiaoCon/archive/2013/03/17/2964409.html
總結
以上是生活随笔為你收集整理的Perl Nmap报告处理摸索(学习)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。