如何批量ping指定网段IP并单独获取每个IP的返回状态
问题原因
- 循环逻辑错误:num初始赋值为2,循环内先做num自增再输出IP,会漏掉192.168.1.2,第一个输出的IP为192.168.1.3。
- ping参数使用错误:Linux环境下
-t是设置TTL的参数,指定超时应该用-W(大写),你写的-t3不会起到3秒超时的作用。 - xargs默认仅返回自身执行是否成功的状态,不会返回每一条ping命令的独立退出码,原脚本也没有对每个IP的执行结果做单独的状态捕获和输出,自然无法区分每个IP的连通性。
修复后脚本(xargs并发版本,匹配你原本的实现思路)
subnet="192.168.1" seq 2 254 | xargs -n 1 -I {} -P 50 bash -c ' ping -c 2 -W 3 "'"${subnet}"'.{}" > /dev/null 2>&1 [ $? -eq 0 ] && echo "'"${subnet}"'.{} 可达" || echo "'"${subnet}"'.{} 不可达" '
如果你习惯用for循环的写法,也可以用下面的版本:
subnet="192.168.1" for i in {2..254}; do ( ping -c 2 -W 3 "${subnet}.${i}" > /dev/null 2>&1 [ $? -eq 0 ] && echo "${subnet}.${i} 可达" || echo "${subnet}.${i} 不可达" ) & done wait
补充说明
- 两个版本都可以输出每个IP的独立连通状态,xargs版本默认限制最多50个并发,执行效率更高不会占用过多进程资源。
- 如果需要保留ping命令的详细返回结果,删除代码里的
> /dev/null 2>&1即可。 - 如果是在macOS环境下执行,ping的超时参数改为
-t 3即可。
内容的提问来源于stack exchange,提问作者user12744746
相关产品推荐
相关产品推荐

