Shell实现多进程扫描IP网段

本文介绍了一种使用Shell脚本进行网络扫描的方法,并通过多进程技术显著提高了扫描效率。通过后台运行Ping命令并等待所有进程完成,实现了快速扫描指定IP范围内的主机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做内网主机存活测试时, 总会要用到IP网段扫描工具, 这样的工具可以是 nmap 之类的专业型网段扫描, 也可以自己编写脚本简单的实现这一过程, 事实上, 我们自己编写的脚本未必会比专业型的速度慢, 这里就以 IP 扫描工具来简单说明一下多进程在shell里的应用:

我们要实现的功能是: ./netScan.sh 192.168.0 1,100
此时, 脚本将扫描192.168.1的网段内1到100号主机. 于是传统的写法为:

domain=`echo $1`
ip_start=`echo $2| cut -d "," -f 1`
ip_end=`echo $2| cut -d "," -f2`
ip_crt=`echo $ip_start`

function segScan(){
        ping -c 1 $1.$2 > /dev/null && echo "$2 is alive"
        rst=`echo $?`
        return $rst
}

while [ $ip_crt -ne $ip_end ]
do
{
        segScan $domain $ip_crt
        rst=`echo $?`
        ip_crt=$((ip_crt+1))
}
done

但这样的脚本效率是很低的, 会蠢到从1到100一个一个去ping, 当存活主机数本就不多的时候等待的时间非常长, 于是我们有了如下的改进:

domain=`echo $1`
ip_start=`echo $2| cut -d "," -f 1`
ip_end=`echo $2| cut -d "," -f2`
ip_crt=`echo $ip_start`

function segScan(){
        ping -c 1 $1.$2 > /dev/null && echo "$2 is alive"&
        rst=`echo $?`
        return $rst
}

while [ $ip_crt -ne $ip_end ]
do
{
        segScan $domain $ip_crt
        rst=`echo $?`
        ip_crt=$((ip_crt+1))
}
done
wait

通过在 ping 命令的后面加一个 &, 把单个的 ping 进程放入后台, 关键字 wait 的使用保证了等待所有 ping 成功完成后再终结父进程, 实践效果如下:
这里写图片描述
如图所示, 扫描完一整个网段仅用了10s

当然, 这里的程序最大的毛病就是没有控制并发量, 这里是 ping 命令, 可能看不到太大的影响, 但如果是比较消耗内存的进程, 一次性的执行这么大数量的子进程对系统而言开销无疑会非常的大! 因此这之类的脚本要根据实际情况设置自己的信号量, 加入数量上的进程控制, 避免因系统开销过大而造成的严重问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blood_Seeker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值