2015-03-03 100 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因此它可以與他們一起做魔術。