【问题标题】:Check for only open port with perl使用 perl 仅检查开放端口
【发布时间】:2012-12-06 18:36:18
【问题描述】:

我需要编写一个脚本来扫描服务器上的端口并生成报告。该脚本应该:

从文件中读取 IP 列表; 扫描每个 IP,并将结果写入一个文件。

我为此使用以下脚本::

#!/usr/bin/perl -w
use strict;
use IO::Socket::PortState qw(check_ports);

my $hostfile = 'hosts.txt';

my %port_hash = (
        tcp => {
            22      => {},
            443     => {},
            80      => {},
            53      => {},
            30032   => {},
            13720   => {},
            13782   => {},
            }
        );

my $timeout = 5;

open HOSTS, '<', $hostfile or die "Cannot open $hostfile:$!\n";

while (my $host = <HOSTS>) {
    chomp($host);
    my $host_hr = check_ports($host,$timeout,\%port_hash);
    print "Host - $host\n";
    for my $port (sort {$a <=> $b} keys %{$host_hr->{tcp}}) {
        my $yesno = $host_hr->{tcp}{$port}{open} ? "yes" : "no";
        print "$port - $yesno\n";
    }
    print "\n";
}

close HOSTS;

现在我要做的一件事是::

扫描所有打开的端口。

目前它正在扫描端口 %port_hash 但我需要扫描所有端口并列出打开的端口。如何做到这一点?

【问题讨论】:

标签: linux perl


【解决方案1】:

这将用所有端口填充 %porthash:

my %port_hash = ( tcp => {} );
for my $port (1 .. 65535) {
  $port_hash{'tcp'}{$port} = {};
}

然后你可以用这个 %port_hash 调用check_ports。

【讨论】:

  • 我在 $hostfile = 'hosts.txt'; 之后写了上面的代码行并显示以下错误::“my”变量 $hostfile 在scanner.pl 第21 行屏蔽了同一范围内的早期声明。“my”变量$hostfile 在scanner.pl 第21 行的同一语句中屏蔽了早期声明。扫描仪的语法错误.pl 第 16 行,靠近 "%port_hash{" 不能使用全局 $!在scanner.pl第21行的“我的”中,靠近“$hostfile:$!”由于编译错误,scanner.pl 的执行被中止。
  • 感谢您的快速回复,但它仍然返回以下结果:主机 - 127.0.0.1 开放端口是:主机 - 94.200.xx.xx0 开放端口是:意味着它返回全部空白
  • 我打错了port_hash 变量名,可以解决吗?
  • 是的,谢谢@barmer 现在可以使用了。您能建议我如何将输出放入文件中吗?
  • 在shell中使用输出重定向:scriptname &gt; file
猜你喜欢
  • 2011-03-04
  • 2012-04-25
  • 2010-12-17
  • 1970-01-01
  • 2011-08-18
  • 2020-05-16
  • 2013-01-23
  • 1970-01-01
  • 2012-08-03
相关资源
最近更新 更多