Shell实现多进程扫描IP网段

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Blood_Seeker/article/details/73321312

在做内网主机存活测试时, 总会要用到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 命令, 可能看不到太大的影响, 但如果是比较消耗内存的进程, 一次性的执行这么大数量的子进程对系统而言开销无疑会非常的大! 因此这之类的脚本要根据实际情况设置自己的信号量, 加入数量上的进程控制, 避免因系统开销过大而造成的严重问题.

猜你喜欢

转载自blog.csdn.net/Blood_Seeker/article/details/73321312