Shell实现多进程扫描IP网段

来源:互联网 发布:淘宝装修日记哪里去了 编辑:程序博客网 时间:2024/06/06 02:15

在做内网主机存活测试时, 总会要用到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))}donewait

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

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

原创粉丝点击