推荐用fping批量扫描多个离散网段:方法一执行fping -ag 网段1 网段2 网段3;方法二用fping -f netlist.txt -a -t 300 -p 50;非标准IP列表则用Shell管道控制并发ping。

排查局域网内所有IP段的设备存活状态,需覆盖多个不连续网段(如192.168.1.0/24、10.20.30.0/24、172.16.5.0/24),不能依赖单一网段for循环,也不能手动逐个执行ping命令。
用fping批量扫多个离散网段
方法一:直接在命令行列出全部目标网段或IP
fping -ag 192.168.1.0/24 10.20.30.0/24 172.16.5.0/24 2>/dev/null
这一步会并发探测每个网段中所有可用地址(自动跳过网络地址和广播地址),只输出存活IP。注意:-a必须与-g搭配使用,否则不生效;【fping默认需要root权限发ICMP包,普通用户可加-S指定本机某网卡IP绕过】。
方法二:从文件读取多个网段定义
先准备netlist.txt,每行一个CIDR或单IP:
192.168.1.0/24
10.20.30.0/24
172.16.5.100
172.16.5.200
然后执行:
fping -f netlist.txt -a -t 300 -p 50 2>/dev/null
-t 300表示每个目标超时300ms,-p 50表示两次探测间隔50ms,避免被限速;输出仅含存活IP,一行一个。
用Shell脚本控制并发数扫任意IP列表
当目标IP来自资产表、CMDB导出或手工整理(非标准网段)时,此法最稳妥。
第一步:准备iplist.txt,每行一个IP,不带空行、不带注释
第二步:创建命名管道并预填30个占位符(控制最大并发30)
mkfifo /tmp/ping_pipe_$$ && exec 9"/tmp/ping_pipe_$$" && for((i=0;i&9
第三步:逐行读取IP,每个ping任务独占一个slot
while IFS= read -r ip; do
read -u9
{ ping -c 1 -W 1 "$ip" >/dev/null 2>&1 && echo "$ip: up" || echo "$ip: down"; echo >&9; } &
done &-
最后一步删管道文件:rm -f "/tmp/ping_pipe_$$"
这个结构能确保最多30个ping同时跑,不会压垮本地CPU或触发远端ICMP限速;【若iplist.txt含重复IP或非法格式,脚本仍会执行但结果不可靠,务必提前去重和校验】。
用for循环快速扫单个C类网段(适合临时应急)
方法一:直接终端执行(无需保存脚本)
for i in {1..254}; do ping -c 1 -W 1 192.168.1.$i | grep "bytes from" | cut -d" " -f4 | cut -d":" -f1; done 2>/dev/null
方法二:分文件导出结果
for i in {1..254}; do if ping -c 1 -W 1 192.168.1.$i >/dev/null 2>&1; then echo "192.168.1.$i" >> alive.txt; else echo "192.168.1.$i" >> dead.txt; fi; done
这种方法简单粗暴,但只适用于单个/24网段;超过200个IP时串行等待明显,且无法跨网段复用。


















