배쉬 멀티스레딩

배쉬 멀티스레딩

열린 포트가 있는지 확인하는 데 사용해야 하는 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

한 가지 방법은 다음과 같습니다.

#!/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

관련 정보