バッシュマルチスレッド

バッシュマルチスレッド

開いているポートがあるかどうかを確認するために使用する必要があるIPのリストがありますnmap。これまで私のスクリプトは次のようになりました。

#!/bin/bash

filename="$1"
port="$2"
echo "STARTING NMAP"
while IFS= read -r line
do
  nmap --host-timeout 15s -n $line -p $2  -oN output.txt | grep "Discovered open port" | awk {'print $6'} | awk -F/ {'print $1'} >> total.txt

done <"$filename"

うまくいきますが遅いです。たとえば、ファイル内の100個のIPを1つずつ実行するのではなく、一度に確認したいと思います。

答え1

1つの方法は次のとおりです。

#!/bin/bash

filename="$1"
port="$2"
echo "STARTING NMAP"

## Read the file in batches of 100 lines
for((i=100;i<=$(wc -l < "$filename");i+=100)); do 
    head -n "$i" "$filename" | tail -n 100 |
        while IFS= read -r line
        do
          ## Launch the command in the background
          nmap --host-timeout 15s -n $line -p $2  -oN output.txt | 
            grep "Discovered open port" | awk {'print $6'} | 
                awk -F/ {'print $1'} >> total.txt &
        done
    ## Wait for this  batch to finish before moving to the next one
    ## so you don't spam your CPU
    wait
done 

答え2

-iL オプションを使用すると、スペース、タブ、または改行で区切ることができ、ループを必要としない宛先 IP アドレスのリストにファイルを渡すことができます。

答え3

バックグラウンドでコマンドを実行できます。

nmap ... >> total.txt &

すべてのバックグラウンドプロセスが完了するのを待つことは、スクリプトで役に立ちます。

[...]
done <"$filename"
wait

関連情報