如何在脚本中使用ping

Guy*_*Guy 10 ssh bash ping

我想要一个bash脚本,它会做:

for c in computers:
do
   ping $c
   if ping is sucessfull:
      ssh $c 'check something'
done
Run Code Online (Sandbox Code Playgroud)

如果我只这样做ssh并且计算机是反应迟钝的,那么超时需要永远.所以我在考虑使用输出ping来查看计算机是否存活.我怎么做?其他想法也会很棒

Ste*_*202 16

使用ping的返回值:

for C in computers; do
  ping -q -c 1 $C && ssh $C 'check something'
done
Run Code Online (Sandbox Code Playgroud)

ping如果单个ping(-c 1)成功,则将以值0退出.在ping超时时,或者如果$C无法解析,它将以非零值退出.

  • @SpaceRocker:非常有趣!我刚检查了`man ping',我倾向于认为这种行为是`ping`中的一个错误,因为在这种情况下我希望返回值为2.Quote:_"如果ping没有收到任何回复数据包它将退出代码1.如果指定了数据包计数和截止时间,并且截止日期到达时收到的数据包数量少于它,它也将退出使用代码1.在其他错误上,它以代码2退出.否则它将以代码0退出.这使得可以使用退出代码查看主机是否处于活动状态."_您对此有何看法? (2认同)

Mik*_*zur 8

在命令中使用-w开关(或-t在FreeBSD和OS X上)ping,然后检查命令的返回值.

ping -w 1 $c
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
    ssh $c 'check something'
fi
Run Code Online (Sandbox Code Playgroud)

-w如果您要连接的主机距离较远且延迟较高,则可能需要调整传递的参数.

来自man ping:

   -w deadline
          Specify  a  timeout, in seconds, before ping exits regardless of
          how many packets have been sent or received. In this  case  ping
          does  not  stop after count packet are sent, it waits either for
          deadline expire or until count probes are answered or  for  some
          error notification from network.
Run Code Online (Sandbox Code Playgroud)


小智 6

并非所有网络环境都允许 ping 通(尽管很多都允许)并且并非所有主机都会响应 ping 请求。我建议不要使用 ping,而是为 ssh 设置连接超时:

对于计算机中的 c;做
  ssh -o ConnectTimeout=2 $c '检查一下'
完毕