linux - 如果使用相同 IP/端口的连接断开,则 Shell 脚本警报

标签 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 在 netstat 输出中出现了 3 次,也没有准确地打印 4 次警报:

这是我当前的代码,除了 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

最佳答案

我对要求还不是很清楚。您将第一个字段称为 $process_name 但在您的 netstat 输出中它将是 addr:port 组合。 Linux 和 BSD 上的实际输出都将协议(protocol)作为第一个字段。此外,您似乎只在寻找已建立的连接,但您使用 netstat 的 -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         

关于linux - 如果使用相同 IP/端口的连接断开,则 Shell 脚本警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574847/

相关文章:

每次保存文件时执行的 linux(和 OSX)shell 命令

json - 如果对应于给定键的值以指定字符串开头,则使用 jq 更新 JSON 文档中的对象

python - 在 Linux 终端中重新着色特定应用程序

linux - Ctrl-p 和 Ctrl-n 在 Docker 下的行为异常

java - 如何通过java程序运行brew命令?

regex - 检查字符串是否有非法字符

bash - 在 Bash 中使用函数

linux - 如何访问 .desktop 文件的 exec 行中的环境变量?

linux - 通过github编辑的文件

linux - 无法通过正则表达式 'teamviewer_12.0.71510_i386.deb' 找到任何包