bash multi-threads

1

Eu tenho uma lista de IPs e preciso verificar se há portas abertas usando nmap . Até agora, meu script é assim:

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

Funciona muito bem, mas é lento e quero verificar, por exemplo, 100 IPs do arquivo de uma só vez, em vez de executá-los um a um.

    
por Donald Duck 25.01.2016 / 11:02

3 respostas

1

Aqui está uma maneira:

#!/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 
    
por 25.01.2016 / 11:37
1

Você pode usar a opção -iL para passar um arquivo para a lista de endereços IP de destino, que podem ser separados por espaços, tabulações ou novas linhas e não precisarão do loop.

    
por 25.01.2016 / 11:17
1

Você pode executar os comandos em segundo plano:

nmap ... >> total.txt &

Pode ser útil aguardar no script que todos os processos em segundo plano sejam concluídos:

[...]
done <"$filename"
wait
    
por 25.01.2016 / 11:20