Bash 用于 ping IP 的脚本,如果 ms 超过 100,则打印 echo msg

Bash script to ping a IP and if the ms is over 100 print a echo msg

我是 bash 脚本编写的新手。

我需要一个脚本来获取对 IP 的 ping 毫秒,如果时间超过 100,它将打印一条回显消息。

对于示例,让我们使用 google ip 8.8.8.8

你能帮帮我吗?

编辑:

好的,怎么做成这样:

#!/bin/sh

echo '>> Start ping test 2.0'

/bin/ping 8.8.8.8 | awk -F' |=' '=="time"'

if [>100]
    then
        echo "Slow response"
    else
        echo "Fast response"
fi

您需要对 ping 输出进行一些转换才能获得实际的毫秒数。

首先,为简单起见,使用 -c 1 标志 ping 只发送一个数据包。

ping 的输出如下所示:

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=59 time=41.101 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 41.101/41.101/41.101/0.000 mss

由于您想要“41.101”部分,因此您需要解析 第二行 的倒数第二个元素 .

要提取第二行,您可以在 awk 中使用 FNR 变量,要获取倒数第二列,您可以使用 NF(字段数)变量.

ping -c 1 8.8.8.8 |  awk 'FNR == 2 { print $(NF-1) }'

这将为您提供 time=41.101,要仅获取数字,请使用 cut 提取等号后的字段

ping -c 1 8.8.8.8 |  awk 'FNR == 2 { print $(NF-1) }' | cut -d'=' -f2

好的...首先,您没有编写 bash 脚本,您的脚本是使用 #!/bin/sh 调用的,因此即使您的系统使用 bash 作为其系统 shell,它在 sh 兼容模式下 运行。所以你不能使用bash主义。改为按照我在下面显示的那样编写脚本。

所以...在我看来,如果您希望 ping 的输出由您的脚本处理,那么 ping 需要实际退出。您的 if 永远不会得到处理,因为 ping 永远不会停止 运行ning。此外,awk 脚本中的 </code> 与 shell 脚本中的 <code> 不同。所以这样的事情可能会奏效:

#!/bin/bash

while sleep 5; do
  t="$(ping -c 1 8.8.8.8 | sed -ne '/.*time=/{;s///;s/\..*//;p;}')"
  if [ "$t" -gt 100 ]; then
    # do something
  else
    # do something else
  fi
done

这个 while 循环,在 shell(或 bash)中将 运行 每五秒 ping 一次,只发送一个数据包(-c 1),并解析其使用 sed 输出。 sed 脚本是这样工作的:

  • /.*time=/{...} - 在该行的大括号中查找包含时间和 运行 内容的行...
  • s/// - 将之前找到的表达式(时间)替换为空(从行中删除)
  • s/\..*// - 用空替换从第一个句点到行尾的所有内容(因为 shell 数学只处理整数)
  • p - 并打印该行的剩余数据。

处理此问题的替代方法是将 ping 的输出解析为 ,而不是为每个测试生成新的 ping 进程。例如:

#!/bin/bash

ping -i 60 8.8.8.8 | while read line; do
  case "$line" in
  *time=*ms)
    t=${line#.*=}   # strip off everything up to the last equals
    t=${t% *}       # strip off everything from the last space to the end
    if [[ (($t > 100)) ]]; then
      # do something
    else
      # do something else
    fi
    ;;
done

这些解决方案有点问题,因为当连接完全消失时它们无法报告。但也许你也可以调整它们来处理这种情况。

请注意,这些可能不是您的最佳解决方案。如果您真的想要一个监控系统,Nagios, Icinga, Munin 等更大规模的系统是一个不错的选择。

对于像这样的小规模 ping 监控,您可能还想看看 fping

我就是这样做的,目的是跟踪缓慢的 ping 时间,如果您想要的话,还可以将邮件发送给我或任何人。

#!/bin/bash

if [ "$#" -ne 1 ]; then
    echo "You must enter 1 command line arguments - The address which you want to ping against"
exit
fi

hostname=$(hostname)

while true; do

RESULT=$(ping -c 1  | awk -v time="$(date +"%Y-%m-%d %H:%M:%S")" -Ftime= 'NF>1{if (+0 > 1) print      " "time }')

if [ "$RESULT" != "" ]; then
echo $RESULT >> pingscript.log
echo $RESULT | mail -s "pingAlert between $hostname -  " foo@bar.com
fi

sleep 2
done