如果连接使用相同的IP /端口丢弃,则Shell脚本警报

时间:2017-10-04 22:00:22

标签: linux bash shell perl sh

我打开了一个新问题,因为我原来的问题已经回答,并且不想改变主题。

我正在尝试监控多个连接进入两个独立的端口但具有相同的IP

实施例

netstat -an |grep 000
101.101.101.101:2000        ESTABLISHED
101.101.101.101:2000        ESTABLISHED
101.101.101.102:3000        ESTABLISHED
101.101.101.102:3000        ESTABLISHED
101.101.101.102:3000        ESTABLISHED
101.101.101.102:3000        ESTABLISHED

我尝试做的是使用nestat和awk来打印第1列,如果1001.1001.1001.1001:200在输出中不是2次而不是警报意味着如果一次停止仍然警告10.1001.1001.1001缺少一个连接

并且如果10.1001.1001.102:3000并不打印4次而不是警报,即使它在netstat输出中存在3次:

这是我当前的代码,除了IP只需要存在一次以使警报不失败时,这一切都很好:

connections=('101.101.101.101' '101.101.101.102')
running=( $(netstat -an |grep 000 |awk '{print $1}') )
non_running=()
for process_name in ${connections[@]}; do
    if [[ "${running[*]}" == *$process_name* ]]; then
        echo "$process_name is running"
    else
        echo "$process_name is not running"
    fi
done

1 个答案:

答案 0 :(得分:0)

我还不太清楚这些要求。您调用第一个字段$process_name但在您的netstat输出中调用addr:port组合。 Linux和BSD上的实际输出都将协议作为第一个字段。此外,您似乎只关注已建立的连接,但是您使用netstat' s -a开关也可以打印监听套接字?

因此,假设您的输出如上所示,我在Perl中这样做:

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

my %minimum = (
    '101.101.101.101:2000' => 2,
    '101.101.101.102:3000' => 5,
);
my %count;

open my $fh, '-|', 'netstat -an' or die "could not run netstat: $!";
while(<$fh>) {
    next unless /^([0-9.]+:\d+000) /;
    $count{$1}++;
}
close $fh;

while(my ($ip_port, $min) = each %minimum) {
    $count{$ip_port} ||= 0;
    next if $count{$ip_port} >= $min;
    print "$ip_port: need $min connections, found only $count{$ip_port}\n";
}

您可能必须在读取循环中调整正则表达式。我使用netstat -tpn来获取活动的TCP连接和进程名称,其输出如下所示:

tcp        0      0 172.30.252.100:39056    52.216.18.58:80         ESTABLISHED 2000/chrome