fping 文件中的主机并 return down ips

fping hosts in file and return down ips

我想使用 fping 来 ping 一个文件中包含的多个 ip,并将失败的 ip 输出到一个文件中,即

hosts.txt

8.8.8.8
8.8.4.4
1.1.1.1

ping.sh

#!/bin/bash
HOSTS="/tmp/hosts.txt"
fping -q -c 2 < $HOSTS

if ip down 
echo ip > /tmp/down.log
fi

所以我想在 down.log 文件中以 1.1.1.1 结尾

这是获得所需结果的一种方法。但是请注意;我没有在脚本中的任何地方使用 fping。如果 fping 的使用对您来说至关重要,那么我可能完全忽略了这一点。

#!/bin/bash

HOSTS="/tmp/hosts.txt"

declare -i DELAY= # Amount of time in seconds to wait for a packet
declare -i REPEAT= # Amount of times to retry pinging upon failure

# Read HOSTS line by line
while read -r line; do
    c=0
    while [[ $c < $REPEAT ]]; do
        # If pinging an address does not return the word "0 received", we assume the ping has succeeded
        if [[ -z $(ping -q -c $REPEAT -W $DELAY $line | grep "0 received") ]]; then 
            echo "Attempt[$(( c + 1))] $line : Success"
            break;
        fi

        echo "Attempt[$(( c + 1))] $line : Failed"

        (( c++ ))
    done

    # If we failed the pinging of an address equal to the REPEAT count, we assume address is down  
    if [[ $c == $REPEAT ]]; then 
        echo "$line : Failed" >> /tmp/down.log # Log the failed address
    fi

done < $HOSTS

用法:./script [delay] [repeatCount] -- 'delay' 是我们等待 ping 响应的总秒数,'repeatCount' 是我们重试 ping 的次数在确定地址已关闭之前发生故障。

这里我们逐行读取 /tmp/hosts.txt 并使用 ping 评估每个地址。如果 ping 一个地址成功,我们将继续下一个地址。如果某个地址失败,我们将按照用户指定的次数重试。如果该地址无法通过所有 ping,我们会将其记录在我们的 /tmp/down.log.

检查 ping 是否 failed/succeeded 的条件对于您的用例可能不准确,因此您可能需要对其进行编辑。不过,我希望这能让大家理解总体思路。

fping的数据解析起来似乎有些困难。它允许解析存活但未死亡的主机的数据。作为解决这个问题并允许使用 -f 同时处理多个主机的方法,所有活动的主机都放在一个名为 alive 的变量中,然后循环遍历 /tmp/hosts.txt 文件中的主机并进行 grepped针对变量 alive 来破译宿主是活的还是死的。 return 代码为 1 表示 grep 无法找到活动主机,因此添加到 down.log。

alive=$(fping -c 1 -f ipsfile | awk -F: '{ print  }')
while read line
do 
    grep -q -o $line <<<$alive
    if [[ "$?" ==  "1" ]]
    then
           echo $line >> down.log
    fi
done < /tmp/hosts.txt