Como passar várias linhas para um parâmetro sem um loop for?

1

Eu tenho o seguinte comando para processar a saída nmap que contém uma lista de ips que fui solicitado a digitalizar:

cat ping-sweep.txt | grep "report for" | cut -d " " -f5

Isso está me fornecendo uma lista de apenas os ip's (um por linha) que eu gostaria de procurar por servidores web.

Eu posso verificar um host individual com o seguinte:

nmap -v -p 80,443,8080 10.1.1.1

Eu gostaria de fazer essa varredura em todos os ip da minha lista, no entanto, inseri-la no nmap parece não funcionar. Preciso criar um script bash com foreach para fazer isso ou há algo simples que esteja faltando?

    
por Michael A 17.03.2017 / 04:47

3 respostas

1

O primeiro passo seria tentar usar o Nmap da maneira que foi projetado. Como o Nmap realiza a descoberta do host ("ping sweep") antes de cada varredura de porta, você pode executar as duas etapas de uma só vez com este comando simples:

nmap -p 80,443,8080 [TARGETS]

Se você realmente precisa realizar a descoberta do host separadamente da varredura de porta, use as robustas opções de saída legíveis por máquina do Nmap, como XML ou Saída do Grepable. Para versões mais antigas do Nmap, a maneira mais fácil seria fazer a descoberta do host e salvar a saída do Grepable da seguinte forma:

nmap -sn [TARGETS] -oG ping-sweep.gnmap

Então você pode extrair os endereços IP facilmente com o awk:

awk '/Status: Up/{print $2}' ping-sweep.gnmap > targets.txt

e importe-os diretamente para o Nmap:

nmap -p 80,443,8080 -iL targets.txt

Como alternativa, com o Nmap 7.00 ou mais recente, você pode usar o formato de saída XML salvo com -oX ping-sweep.xml e os alvos -xml Script NSE:

nmap -p 80,443,8080 --script targets-xml --script-args newtargets,iX=ping-sweep.xml

Com qualquer uma dessas opções, se a varredura de descoberta do host for recente o suficiente, você poderá adicionar a opção -Pn para pular a fase de descoberta do host da varredura de porta. Isso economiza um pouquinho de velocidade de verificação, já que você deve poder contar com os mesmos hosts que ainda estão ativos.

O que você realmente não deveria fazer é qualquer solução que envolva loops ou xargs , pois eles acabarão lançando uma instância separada do Nmap para cada destino. Isso é um desperdício e é desnecessário, pois cada instância terá que duplicar o trabalho de carregar arquivos de dados e enviar probes de tempo para monitorar a capacidade da rede, e as instâncias separadas estarão competindo entre si pelos recursos de rede em vez de cooperar. Além disso, você terá que recombinar suas saídas separadas no final.

    
por 18.03.2017 / 05:24
1

Mais genericamente, você pode usar xargs para passar cada linha como argumento da linha de comando para um comando, assim:

cat ping-sweep.txt | grep "report for" | cut -d " " -f5 | xargs -I'{}' nmap -v -p 80,443,8080 '{}'
    
por 17.03.2017 / 06:44
1

Você pode dar a nmap todos os endereços para varrer como parâmetros, assim:

nmap -v -p 80,443,8080 $(grep "report for" ping-sweep.txt | cut -d" " -f5)

Isso executa grep em seu arquivo (sem necessidade de cat ), filtra a saída de grep através de cut e o resultado disso é usado para criar a linha de comando nmap . Isso é conhecido como substituição de comandos .

Existem loops no shell e você pode usar um, de várias maneiras:

grep "report for" ping-sweep.txt | cut -d" " -f5 | while read ip; do
    nmap -v -p 80,443,8080 "${ip}"
done

ou

for ip in $(grep "report for" ping-sweep.txt | cut -d" " -f5); do
    nmap -v -p 80,443,8080 "${ip}"
done

Ambos executarão nmap com um endereço por vez.

    
por 17.03.2017 / 06:43