那年那日那朵花

".......(o´ω`o)......"

检测局域网内活动的主机和某主机的端口

2016-05-27 10:56 linux

在管理某一个局域网的时候,有时候需要检测这个局域网内有哪些主机是活动的(之前遇到过这样的场景,办公室电脑IP之前都是手动配置,DHCP也不用,以前么又啥都没记录,很混乱,买了新办公电脑都不知道给配哪个地址,就怕会地址冲突,所以就希望能有个仍在活动的主机IP清单,这样可以整理下,不过如果电脑关机了的话就会有问题了。。。。)所以这种场景就可以使用脚本实现,脚本的话会更加的灵活一点。

脚本举例如下:

#!/bin/bash
suffix=`date +%Y%m%d`
cp alivehost.txt alivehostbak${suffix}
> alivehost.txt
for ip in 10.146.14.{1..255}
do 
  (
  ping $ip -c 2 &> /dev/null
  if [ $? -eq 0 ]
  then 
      echo "$ip is alive" |tee  -a alivehost.txt
  fi
)&
done
wait

sort  -n -t. -k 4 alivehost.txt -o  alivehost.txt
  • 脚本通过for循环ping网段内的主机,ping通的话echo成功信息重定向到记录文件中。
  • 在循环内一个个ping的话,累计起来是一段比较长的时间。所以通过并行的方式执行。将循环放到()&内,作为子shell并通过&来放到后台运行。
  • wait放在循环结束后,等待子shell全部执行完再做后续工作。
  • 最后将记录文件中的无序信息根据IP地址排列为有序信息。

同理可得,可以实现对某台主机端口的检测。这里可以使用nc命令实现。

#!/bin/bash
for port in {10000..65535} ;
do
   (

    nc -z -v -w1 159.1.1.17 $port  &> /dev/null
    if [ $? -eq 0 ]
    then
         echo "$port is open"
    fi

   )&

done
wait

同样使用并行的方式,避免一个个端口检测——那样会很慢。

以上方式会有一个小问题。如果IP地址段比较大或者端口范围比较大的话,脚本并行操作会带来瞬时主机负载上升。如果是生产上的话,可能会被监控系统监测到引起误报,所以这个就在办公室的服务器上或者无关紧要的服务器上玩玩就好了。

心情

Cloudhu 个人随笔|built by django|

沪ICP备16019452号-1