2015-03-03 97 views
2

我想扫描多个主机中的多个端口。我使用了这个脚本,但显示结果需要很长时间。外壳脚本端口扫描器

#!/bin/bash 
hosts=(
"server1" 
"server2" 
) 
for host in "${hosts[@]}" 
do 
     echo "==========================================" 
     echo "Scanning $host" 
     echo "==========================================" 
      for port in {21,22,80} 
      do 
      echo "" > /dev/tcp/$host/$port && echo "Port $port is open" 
    done 2>/dev/null 
done 

有人建议用telnetNetCat代替,但我更喜欢做它无需安装任何新的软件包。那么,有什么方法可以通过多线程或其他方式来加速它。

回答

1

您可以在后台运行所有三个戳,然后等待它们全部完成,并且可能会将运行时间缩短到1/3。

for port in 21 22 80; do 
    echo "" > /dev/tcp/$host/$port 2>/dev/null & 
    pid[$port]=$! 
done 
for port in 21 22 80; do 
    wait $pid[$port] && echo "Port $port" is open" 
done 

您可以通过在后台运行多个主机来增加并行性,但这应该是一个明显的扩展。

2

您可以使用GNU并行来并行运行所有检查。我不是最好的使用它,和@ OleTange(作者)通常必须纠正我,但我一直试图。所以,让我们尝试一下你的情况,通过慢慢建立起来:

parallel echo {1} {2} ::: 192.168.0.1 192.168.0.8 ::: 21 22 80 

192.168.0.8 22 
192.168.0.8 80 
192.168.0.8 21 
192.168.0.1 80 
192.168.0.1 22 
192.168.0.1 21 

看起来有点像我。然后,我在-k加入保存结果,以便和我提供一个函数,它的IP地址和端口作为参数:

parallel -k 'echo "" > /dev/tcp/{1}/{2} && echo {1}:{2} is open' ::: 192.168.0.1 192.168.0.8 ::: 21 22 80 2>/dev/null 
192.168.0.1:80 is open 
192.168.0.8:21 is open 
192.168.0.8:22 is open 
192.168.0.8:80 is open 

这将并行运行8组的工作,如果你的CPU有8个内核,但echo并不是非常耗费资源,所以你可能可以并行运行32个,所以在-k之后加上-j 32即可。

如果你想坚持更接近自己的脚本,你可以做这样的:

#!/bin/bash 
hosts=(
"192.168.0.1" 
"192.168.0.8" 
) 
for host in "${hosts[@]}" 
do 
    for port in {21,22,80} 
    do 
     echo "(echo > /dev/tcp/$host/$port) 2>/dev/null && echo Host:$host Port:$port is open" 
    done 
done | parallel -k -j 32 

基本上,而不是运行你的命令,我只是将它们发送到parallelstdin因此它可以与他们一起做魔术。