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
我是 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