我需要从文件中 ping 一个 IP 地址列表并将状态记录为“向上”或“向下”

我需要从文件中 ping 一个 IP 地址列表并将状态记录为“向上”或“向下”

我需要 ping 主机地址列表(非连续)并将输出记录为“向上”或“向下”。我已经开始了,但我的脚本似乎有问题。例如。当我针对包含 150 个主机的主机文件运行以下脚本时,我在输出文件中收到 400 多个“向上”或“向下”回复。

#!/usr/bin/bash
#script name: lrkdc01ping.sh
date >> /home/insight/scripts/lrkdc01ping.out
cat /home/insight/scripts/lrkdc01.txt |  while read output
do
    ping -c 1 "$output" >> /dev/null
    if [ $? -eq 0 ]; then
        echo "node is up" >> /home/insight/scripts/lrkdc01ping.out
    else
        echo "node is down" >> /home/insight/scripts/lrkdc01ping.out
    fi
done

答案1

我建议这样的事情,这也会清除每次运行的输出文件,而不是每次都附加到它:

#!/usr/local/bin/bash
outfile="/home/insight/scripts/lrkdc01ping.out"
date > "$outfile"
while read output; do
    echo -n "$output is " >> "$outfile"
    if ping -c1 "$output" > /dev/null 2>&1; then
        echo "up" >> "$outfile"
    else
        echo "down" >> "$outfile"
    fi
done < /home/insight/scripts/lrkdc01.txt

主要区别在于使用>而不是>>调用date,这样每次运行都会有一个干净的文件;并简化您对退出代码的使用ping

更干净的是

if verb; then
    action
else
    failure_action
fi

而不是

verb
if [[ 0 -eq $? ]]; then
    action
else
    failure_action
fi

此外,如果您决定移动或更改输出文件的名称,则不必编辑四个位置,而是将其放入一个变量中,以便您只需在一处更新它。我的一般经验法则是“如果您输入同一内容两次以上,则应该将其抽象化”。

相关内容