基于过滤器 Ping 主机并返回死或活

基于过滤器 Ping 主机并返回死或活

我正在尝试创建一个能够从目录中的文本文件 ping 多个主机的脚本。主机具有特定的命名约定并进行分组。例如在文本fie中

10.10.10.10 XX-YY_ZZ name of the host in form of URL 

该文件不是 CSV 而是 txt。

我希望做的是一些简单的事情,当你运行说pingme YYYY属于某个位置的设备的共同元素在哪里)时,它会返回给我一个结果,例如:

XX-YY_ZZ = ALIVE

可能非常简单,但我不知道如何开始,因为我们运行的是 Linux REDHAT。

任何指示和想法将不胜感激。

答案1

我相信这会做你想要的:

pingme () {
hostfile="/home/jbutryn/test/hostfile.txt"
IFS= mapfile -t  hosts < <(cat $hostfile)
for host in "${hosts[@]}"; do
    match=$(echo "$host" | grep -o "\-$1_" | sed 's/-//' | sed 's/_//')
    if [[ "$match" = "$1" ]]; then
        hostname=$(echo "$host" | awk '{print $2}')
        ping -c1 -W1 $(echo "$host" | awk '{print $1}') > /dev/null
        if [[ $? = 0 ]]; then
            echo "$hostname is alive"
        elif [[ $? = 1 ]]; then
            echo "$hostname is dead"
        fi
    fi
done
}

您可以像这样运行这个函数: pingme UR01它应该返回类似以下内容:

[root@JBCLAMP001 test]# pingme CC
BB-CC_DD is dead
AA-CC_EE is alive
[root@JBCLAMP001 test]# pingme DD
CC-DD_EE is dead
CC-DD_JJ is alive

答案2

您可以使用退出代码来ping确定 ping 是否成功或失败。

ping HOST -c1 > /dev/null && echo "ALIVE" || echo "DEAD"

当主机处于活动状态时,退出代码为 0,而当主机死亡时,退出代码为 1。要 ping 每个主机,您可以循环每一行并使用它awk来获取包含地址/主机名的第一列。

exec 3<input.txt

while read -u3 line
do
    if [ "$line" == "" ]; then
        # skip empty lines
        continue
    fi

    ping -c1 $(echo "$line"| awk '{print $1}') > /dev/null

    if [ $? = 0 ]; then
        echo "$line=ALIVE"
    else
        echo "$line=DEAD"
    fi
done

编辑:

如果您只想通过匹配文件中的一行来 ping 主机,您可以 grep 它:

# find line for $host, only 1 line
line = grep "$HOST" input.txt |tail -n 1

# $($line |awk '{print $1}') outputs the first column of line (address)
ping -c1 $($line |awk '{print $1}') >/dev/null && echo "$line=ALIVE" || echo "$line=DEAD"

相关内容