1

我写了一个简单的基于 ping 的 IP 扫描器(见下文),但它有一个问题。

#!/bin/bash

counter = 0

for ip in 192.168.44.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" &
  let counter++
  if [[ "$counter" -eq 254 ]];
  then
      exit 0;
  fi
done

首先,for 循环似乎正在启动多个线程,并且终端的唯一输出是 ping 答案。但是,当脚本完成对网络中所有机器的 ping 操作后,它永远不会退出,如下图所示:

脚本输出

我必须按下Enter才能最终结束它。

我也尝试exit 0在声明之后放置一个done,但它仍然不起作用。当 for 循环结束时,如何使脚本退出?

注意:我发现此实现是在 LAN 中查找现有机器的最快速度,但如果有人建议更合适的代码,我将不胜感激。

4

3 回答 3

1

你可以试试这个:

#!/bin/bash
for ip in 192.168.44.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" & 
done
wait
于 2019-10-02T05:01:30.860 回答
1

假设您不想使用专用的网络扫描工具,您可以使用 bash 或 xargs 并行遍历所有地址: Bash:

#! /bin/bash -x

for ip in 192.168.44.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" &
done
# Wait for all children to finish
wait

或者使用 xargs,其优点是您可以控制被 ping 的并行地址的数量(在本例中为 20) - 以避免因大量并发进程而使服务器过载。

echo 192.168.44.{1..254} | xargs --max-args=1 -P20 ping -c 1 -W 1
于 2019-10-02T05:01:54.710 回答
0

如果CTRLc可以接受:

parallel -j0 --lb ping ::: 192.168.1.{1..250}
于 2019-10-07T16:24:12.870 回答