无法在 for 循环结束时退出 bash 脚本

Cannot exit bash script at the end of the for cycle

我写了一个简单的基于 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 才能结束它。

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

注意:我发现这个实现是在 LAN 中查找现有机器最快的,但是如果有人有更合适的代码建议,我会感激不尽

你可以试试这个:

#!/bin/bash
for ip in 192.168.44.{1..254}; do
  ping -c 1 -W 1 $ip | grep "64 bytes" & 
done
wait

假设你不想使用专门的网络扫描工具,你可以使用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

如果CTRLc可以接受:

parallel -j0 --lb ping ::: 192.168.1.{1..250}