GNU Parallel: Como limitar o máximo de tarefas de rede por host

4

Estou usando o GNU Parallel para escanear uma lista de URLs (de hosts diferentes) para obter vulnerabilidades, como esta:

cat urls.txt | parallel --gnu -j 50 ./scan {}

O programa 'scan' funciona para um URL em um thread. E preciso limitar o número de solicitações simultâneas (jobs) para cada host, por exemplo, para 5 conexões. Como posso conseguir isso?

    
por Karim Valiev 05.04.2015 / 20:13

1 resposta

1

Divida os URLs em um arquivo por host. Em seguida, execute 'parallel -j5' em cada arquivo.

Ou classifique urls e insira um delimitador '\ 0' quando um novo host for encontrado, então divida em '\ 0' e remova '\ 0' enquanto passa isso como um bloco para uma nova instância de paralelo:

sort urls.txt | 
  perl -pe '(not m://$last:) and print "
cat urls.txt | parallel -q -j50 sem --fg --id '{= m://([^/]+):; $_=$1 =}' -j5 ./scan {}
";m://([^/]+): and $last=$1' | parallel -j10 --pipe --rrs -N1 --recend '
sort urls.txt | 
  perl -pe '(not m://$last:) and print "
cat urls.txt | parallel -q -j50 sem --fg --id '{= m://([^/]+):; $_=$1 =}' -j5 ./scan {}
";m://([^/]+): and $last=$1' | parallel -j10 --pipe --rrs -N1 --recend '%pre%' parallel -j5 ./scan
' parallel -j5 ./scan

Editar:

Acho que isso funcionará:

%pre%

sem faz parte do GNU Parallel (é uma abreviação de parallel --semaphore ). {= m://([^/]+):; $_=$1 =} pega o nome do host. -j5 informa sem para fazer um semáforo de contagem com 5 slots. --fg força sem a não gerar o trabalho em segundo plano. Usando o nome do host como ID, você receberá um semáforo de contagem para cada nome de host.

-q é necessário para parallel se alguns dos seus URLs contiverem caracteres de shell especiais (como &). Eles precisam ser protegidos da expansão de shell porque sem também os expandirá.

    
por 06.04.2015 / 04:07