使用bash脚本中的ping命令来检查主机可用性

98

我想编写一个脚本,可以不断检查网络中应该全天在线的设备是否真的在线。我尝试使用ping命令,但是...

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

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


1
你应该考虑使用 nmap,它允许你指定 IP 地址范围。 - devnull
就你的片段而言,据我测试,它是可以正常运行的。 - Torsten Bronger
虽然这不是答案,但最好使用“$(ping -c 1 some_ip_here)”而不是“ping -c 1 some_ip_here”。参考此链接以获取更多信息 - Anubis
1
没有人解释你的脚本的实际问题。你所写的代码会获取ping命令打印的所有输出,然后检查是否为非空字符串。由于无论成功与否,ping命令总是会打印出一些内容,因此它永远不会打印空字符串。要检查一个命令是否成功,不需要用反引号、引号或括号将其包围起来。只需直接写if cmd; then ... fi即可。 - Jonathan Wakely
11个回答

-1

这在终端仿真器窗口中似乎运行得相当不错。它会循环直到建立连接,然后停止。

#!/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 是为了在连接时获取一个响铃字符。我一直在尝试在 LXDE/lxpanel 中实现这一点,但是一旦我重新连接到网络,所有操作都会停止。时间开始作为进度指示器,因为如果你只看到每行都是 "down" 的窗口,你甚至无法判断它是否在移动。


应该把-w2改为-W2(W要大写)。 - Fre Timmerman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接