shell 用于ping IP的Bash脚本,如果ms超过100,则打印回显消息

ryevplcw  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(219)

我是bash脚本的新手。
我需要一个脚本来获取ping到IP的毫秒数,如果时间超过100,它将打印一条回显消息。
例如,让我们使用google ip 8.8.8.8
你能帮帮我吗?
编辑:
好吧,怎么把它做成这样:

#!/bin/sh

echo '>> Start ping test 2.0'

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

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

vd8tlhqk1#

首先,你不是在写bash脚本,你的脚本是使用#!/bin/sh调用的,所以即使你的系统使用bash作为它的系统shell,它也是在sh兼容模式下运行的。所以你不能使用bashisms。按照我下面所示的方法写你的脚本。
所以......在我看来,如果你想让你的ping有由你的脚本处理的输出,那么ping实际上需要退出。你的if永远不会得到处理,因为ping永远不会停止运行。而且,awk脚本中的$11与shell脚本中的$11是不同的。所以类似这样的操作可能会起作用:

#!/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

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

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

另一种处理方法是将ping的输出解析为 stream,而不是为每个测试生成一个新的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

这些解决方案有一点问题,因为当连接完全消失时,它们无法报告。但也许你也可以调整它们来处理这种情况。
请注意,这些可能不是你的最佳解决方案。如果你真的想要一个监控系统,更大规模的东西,如NagiosIcingaMunin等,是一个很好的方法。
对于像这样的小规模ping监视,您可能还需要查看fping

ars1skjm

ars1skjm2#

您需要对ping的输出进行一些转换,以获得毫秒的实际数值。
首先,为了简化此操作,请使用ping-c 1标志,以便仅发送一个数据包。
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
cbjzeqam

cbjzeqam3#

这就是我所做的,以获得跟踪慢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 $1 | awk -v time="$(date +"%Y-%m-%d %H:%M:%S")" -Ftime= 'NF>1{if ($2+0 > 1) print $1 $2 $4 $3 $5 " "time }')

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

sleep 2
done
vql8enpb

vql8enpb4#

下面是我从不同的例子中提取的一个脚本。

#!/bin/bash

host=$1

if [ -z $host ]; then
    echo "Usage: `basename $0` [HOST]"
    exit 1
fi

function pingTestTime()
{
    while :; do
        test2 $1
        sleep 1
    done
}

function test2()
{
    now=`date "+%a %D %r"`
    timeinms=$(ping -c 1 $1 | grep -oP 'time=\K\S+')
    status=$?
    
    timeint=${timeinms%.*}
    
    if [ ! -z "$timeint"  ]
    then
    
        if (( $timeint > 100 )); then
          extraText="FAIL (Slow)"
        else
          extraText="ok"
        fi
    else
        extraText="FAIL (Not Connected)"
    fi
    
    #echo "Status="$status
    echo $now $timeinms"ms" $extraText
}

pingTestTime $host

相关问题