81

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

if [ "`ping -c 1 some_ip_here`" ]
then
  echo 1
else
  echo 0
fi

1无论我输入有效还是无效的 IP 地址,都会给出。如何检查特定地址(或更好的 IP 地址列表中的任何设备)是否离线?

4

11 回答 11

78

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 表示无法访问

于 2013-08-08T10:08:46.207 回答
66

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

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

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

于 2013-08-08T10:15:09.057 回答
29

我能想到一个这样的班轮来运行

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
于 2015-08-15T22:02:44.230 回答
24

有高级版本的 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
于 2014-09-02T09:39:33.467 回答
6

这是一个完整的 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
于 2020-12-18T10:41:37.707 回答
5

仅供参考,我只是使用上述方法进行了一些测试,如果我们使用多 ping(10 个请求)

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

如果至少有一个 ping 结果可达,multi ping 命令的结果将为“0”,如果所有 ping 请求都不可达,则为“1”。

于 2014-11-03T11:21:20.380 回答
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
于 2016-09-30T23:08:39.457 回答
1
for i in `cat Hostlist`
do  
  ping -c1 -w2 $i | grep "PING" | awk '{print $2,$3}'
done
于 2020-09-10T18:46:38.760 回答
0

每隔一秒检查一次主机,并在主机到达时发送消息

while :;do ping -c 1 -w 1 -q 8.8.8.8 &>/dev/null && /root/telegram-send.sh "Host reacheble now" && break || sleep 1;done
于 2021-12-23T12:39:22.277 回答
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 中执行此操作,但一切都会停止,直到我再次建立网络连接。将时间作为进度指示器开始是因为如果您查看每行仅“向下”的窗口,您甚至无法判断它正在移动。

于 2020-01-07T21:35:49.830 回答
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

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

于 2020-12-10T19:00:35.473 回答