如何修改Perl脚本实现gnmap文件按主机聚合开放端口输出
修改Perl脚本实现主机IP+聚合端口输出
修改后的完整脚本
perl -ne ' BEGIN { %host_ports = (); $current_host = ""; } if (/^Host: (\S+)/) { if ($current_host ne "") { print "$current_host;" . join(";", @{$host_ports{$current_host}}) . "\n"; delete $host_ports{$current_host}; } $current_host = $1; $host_ports{$current_host} = [] unless exists $host_ports{$current_host}; } while (m/(\d+)\/open/g) { push @{$host_ports{$current_host}}, $1; } END { if ($current_host ne "") { print "$current_host;" . join(";", @{$host_ports{$current_host}}) . "\n"; } } ' < nmap.out
调整分隔符(可选)
如果需要和你给出的例子完全一致(端口用逗号分隔),只需把脚本中两处join(";", ...)改成join(",", ...),修改后输出格式为:IP_A;port1,port2,port3...
修改思路拆解
- 用哈希存储数据:创建哈希
%host_ports,以主机IP为键,对应的值是存储该主机所有开放端口的数组,实现“一个主机对应多个端口”的关联存储。 - 切换主机时输出上一个主机结果:每次匹配到新的
Host: IP行时,先检查是否有未输出的上一个主机数据,如果有就按格式打印,再清空旧数据,避免重复输出。 - 收集当前主机的端口:每匹配到一个开放端口,就把端口号添加到当前主机对应的端口数组中,不立即输出,而是先攒起来。
- 脚本结束前输出最后一个主机:因为最后一个主机没有后续的新主机触发输出,所以在脚本末尾的
END块中单独处理,确保所有数据都被输出。
内容的提问来源于stack exchange,提问作者Simulacrum
相关产品推荐
相关产品推荐

