在bash脚本中使用ping检查主机可用性

时间:2013-08-08 10:06:00

标签: bash networking ping connectivity

我想编写一个脚本,该脚本将继续检查网络中任何应该整天在线的设备是否真的在线。我尝试使用ping,但

if [ "`ping -c 1 some_ip_here`" ]
then
  echo 1
else
  echo 0
fi
无论我输入有效或无效的IP地址,

都会给1。如何检查特定地址(或更好的IP地址列表中的任何设备)是否脱机?

10 个答案:

答案 0 :(得分:57)

Ping会根据错误类型返回不同的退出代码。

ping 256.256.256.256 ; echo $?
# 68

ping -c 1 127.0.0.1 ; echo $?
# 0

ping -c 1 192.168.1.5 ; echo $?
# 2

0表示主机可达

2表示无法访问

答案 1 :(得分:49)

您不需要if语句中的反引号。您可以使用此检查

if ping -c 1 some_ip_here &> /dev/null
then
  echo 1
else
  echo 0
fi

if命令检查以下命令的退出代码(ping)。如果退出代码为零(这意味着命令退出成功),则将执行then块。如果它返回非零退出代码,则将执行else块。

答案 2 :(得分:21)

有高级版本的ping - “fping”,可以用毫秒来定义超时。

#!/bin/bash
IP='192.168.1.1'
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null
if [ "$?" = 0 ]
then
  echo "Host found"
else
  echo "Host not found"
fi

答案 3 :(得分:14)

我可以想到像这样的一个班轮来运行

ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail

将127.0.0.1替换为IP或主机名,将echo命令替换为两种情况下需要执行的操作。

上面的代码会成功,也可以尝试使用您知道无法访问的IP或主机名。

像这样:

ping -c 1 google.com &> /dev/null && echo success || echo fail

和这个

ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail

答案 4 :(得分:3)

FYI, 我刚刚使用上面的方法进行了一些测试,如果我们使用多个ping(10个请求)

  

ping -c10 8.8.8.8&> / dev / null; echo $?

如果至少有一个ping结果可达,则多ping命令的结果将为“0”, 如果所有ping请求都无法访问,则为“1”。

答案 5 :(得分:2)

up=`fping -r 1 $1 `
if [ -z "${up}" ]; then
    printf "Host $1 not responding to ping   \n"
    else
    printf "Host $1 responding to ping  \n"
fi

答案 6 :(得分:1)

这是一个完整的bash脚本,每5秒ping目标一次,并将错误记录到文件中。

享受!

#!/bin/bash
        
        FILE=errors.txt
        TARGET=192.168.0.1

          touch $FILE
          while true;
          do
            DATE=$(date '+%d/%m/%Y %H:%M:%S')
            ping -c 1 $TARGET &> /dev/null
            if [[ $? -ne 0 ]]; then
              echo "ERROR "$DATE
              echo $DATE >> $FILE
            else
              echo "OK "$DATE
            fi
              sleep 5
          done

答案 7 :(得分:0)

这在终端仿真器窗口中似乎工作得很好。一直循环直到建立连接然后停止。

#!/bin/bash

# ping in a loop until the net is up

declare -i s=0
declare -i m=0
while ! ping -c1 -w2 8.8.8.8 &> /dev/null ;
do
  echo "down" $m:$s
  sleep 10
  s=s+10
  if test $s -ge 60; then
    s=0
    m=m+1;
  fi
done
echo -e "--------->>  UP! (connect a speaker) <<--------" \\a

最后的\ a试图在连接上获取bel char。我一直在尝试在LXDE / lxpanel中执行此操作,但是一切都停止了,直到再次建立网络连接为止。时间是作为进度指示器开始的,因为如果您看着每行都只有“向下”的窗口,您甚至无法说出它在移动。

答案 8 :(得分:0)

for i in `cat Hostlist`
do  
  ping -c1 -w2 $i | grep "PING" | awk '{print $2,$3}'
done

答案 9 :(得分:0)

我喜欢检查列表的想法,

for i in `cat Hostlist`
do  
  ping -c1 -w2 $i | grep "PING" | awk '{print $2,$3}'
done

但是该代码段并不关心主机是否无法访问,因此恕我直言不是一个好答案。

我跑去写了

for i in `cat Hostlist`
do
  ping -c1 -w2 $i >/dev/null 2>&1 ; echo $i $?
done

然后我可以相应地处理每个问题。