【问题标题】:Script that only counts Established, TIME_WAIT, and Closed Wait connections using Netstat使用 Netstat 仅计算已建立、TIME_WAIT 和已关闭等待连接的脚本
【发布时间】:2015-11-29 16:15:09
【问题描述】:

我正在尝试为 Windows 编写一个脚本,它只会计算系统上的已建立、Time_Wait 和 Closed_Wait 连接的数量,并在命令提示符下打印它们。我已经制作了一个可以在 Linux 机器上执行此操作的 shell 脚本,但是 shell 脚本在 Windows 中不起作用。我尝试使用 .bat 来执行脚本,但它不起作用(可能是因为它仍然是 Windows 中的 shell 脚本:/)它必须只显示已建立、Time_Wait 和 Closed_Wait 的原因是因为脚本正在由监控程序使用,如果出现任何其他连接类型,该程序将失败。任何人都可以提出建议吗?谢谢!

【问题讨论】:

  • 您使用什么参数来生成输入,请提供输出的样例。
  • 我原来的Linux脚本输入是:ESTABLISHED=netstat -nat | egrep 'ESTABLISHED' | wc -lTIME_WAIT=netstat -nat | egrep 'TIME_WAIT' | wc -lCLOSE_WAIT=netstat -nat | egrep 'CLOSE_WAIT' | wc -lSYN_SENT=netstat -nat | egrep 'SYN_SEND' | wc -lSYN_RECV=netstat -nat | egrep 'SYN_RECVEIVED' | wc -lecho $ESTABLISHED echo $TIME_WAIT CLOSE_WAIT echo $SYN_SENT echo $SYN_RECV 输出应该只是 5 个单独行上每个连接状态的计数。
  • @monkeychef 您应该使用该信息编辑您的原始帖子。

标签: windows perl shell batch-file netstat


【解决方案1】:

以下(应该)在不对 *nix 和 Windows 进行任何更改的情况下工作。我已经在 Ubuntu w/ Perl v.5.18.0、Linux Mint w/ Perl v5.22.0 和 Win2k8R2(w/ Strawberry Perl v5.8.8)上对其进行了测试。

#!/usr/bin/perl
use strict;
use warnings;

my @stat = split '\n', `netstat -nat`;

my @wanted = qw(
                ESTABLISHED
                TIME_WAIT
                CLOSED_WAIT
                SYN_SENT
                SYN_RECV
            );

my %data = map {$_ => 0} @wanted;

for (@stat){
    s/^\s+//;

    my $status;

    if ($^O eq 'MSWin32'){
        $status = (split)[3];
    }
    else {
        $status = (split)[5];
    }

    next if ! $status;

    $data{$status}++ if defined $data{$status};
}

print "$data{$_}\n" for @wanted;

【讨论】:

  • 这太棒了,谢谢!我试图通过修改第 6 行并在末尾添加两行来添加其他两个状态(syn_sent 和 syn_received),但这似乎破坏了脚本。有什么方法需要这样做吗?
  • 我对效率进行了一些重大更改。如果您想添加更多条目,请将它们放入@wanted 列表中。输出按@wanted 列表所在的顺序打印。您可以从该列表中添加/删除,它不会影响输出以外的任何内容。
  • 非常感谢您的帮助,这太棒了!
猜你喜欢
  • 2016-09-07
  • 2016-01-16
  • 2019-08-14
  • 2020-05-13
  • 2017-01-15
  • 2013-03-11
  • 2016-07-18
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多