Maneira rápida de procurar portas abertas na rede local de acordo com uma lista

1

Como posso descobrir rapidamente se a porta 80 está aberta / ouvindo em um servidor por meio de um script bash?

Normalmente, em todas as estações de trabalho, o daemon está em execução, mas às vezes falha. Eu uso o seguinte comando para verificar se um endereço IP tem uma porta aberta. Eu gostaria de poder fazer isso para cada linha em um arquivo sem ter que digitá-lo manualmente toda vez.

 nc -zw3 10.101.0.13 80 && echo "opened" || echo "closed"

O arquivo de lista é assim, onde 3333 e 3334 são strings após $ip;

10.101.0.13; 3333
10.101.0.15; 3334
10.101.0.17; 4143
10.101.0.21; 1445
10.101.0.27; 2443
10.101.0.31; 2445
10.101.0.47; 3443
10.101.0.61; 3445

Eu tenho que separar as portas abertas das portas fechadas, então eu terei uma lista de servidores com falhas que terão que ser consertadas.

Eu tentei algo assim sem sucesso:

while IFS=";" read ip port ; do nc -zw3 "$ip" "$port" && echo "$ip:$port => opened" || echo "$ip:$port =>  closed" ; done < list.txt

while IFS=";" read ip port ; do nc -zw3 "${ip}" "${port}" && echo "${ip}:${port} => opened" || echo "${ip}:${port} =>  closed" ; done < list.txt
    
por Mikhael Djekson 29.01.2014 / 09:03

3 respostas

1

Aqui está o comando Nmap mais básico e eficiente para fazer o que você quer (e nada mais):

#!/bin/sh
# Gather the IPs to scan for each port
perl -lanF\; -e'push @{$p{$F[1]}}, $F[0];END{$,=" ";while(($x,$y)=each%p){print $x,@$y}}' input.txt | while read port ips; do
  # Scan the appropriate port for each set of IPs
  nmap -Pn -n -oG - -p $port $ips |\
  # Put the open ones into open.txt and the closed/filtered into closed.txt
  awk 'OFS=":";$4~/^Ports:/{if(/open/){print $2,'$port' >> "open.txt"}else{print $2,'$port' >> "closed.txt"}}'
done

Infelizmente, o Nmap não tem uma maneira interna de varrer apenas algumas portas em alguns IPs e outras portas em outros IPs, caso contrário, isso pode ser muito mais simples.

    
por 01.02.2014 / 23:15
1
#!/bin/bash
N=0
cat $1 | while read line
do
    N=$((N+1))
    nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )" 
done

Uso: ./script.sh Verifica o arquivo especificado e testa se cada "$ ip; $ port" está aberto ou fechado.

Se você quiser uma saída classificada: ./script.sh | classificar

Nenhuma instalação é necessária.

Como uma linha que você pode colar no seu terminal sem precisar criar um script de shell:

N=0; cat FILENAME | while read line; do; N=$((N+1)); nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )"; done
    
por 01.02.2014 / 19:30
1

O mais fácil é instalar o nmap a partir dos repositórios, e então:

   awk -F ";" '{print $1}' data | xargs -L 1 nmap -p 80

onde data é o arquivo com os endereços IP a serem verificados.

Editar:

Se for verdade, como sugere @pabouk abaixo, que o número após o endereço IP é a porta a ser digitalizada, então você pode obter a varredura desejada da seguinte forma:

   awk -F ";" '{print "nmap " $1 " -p" $2}' data | xargs -I % sh -c '%'

Se você deseja escanear tanto a porta 80 quanto a porta lida do arquivo, você pode fazê-lo com este comando:

   awk -F ";" '{print "nmap " $1 " -p80," $2}' data | xargs -I % sh -c '%'

Se o nmap produzir demasiada saída, o seguinte comando fará:

   awk -F ";" '{print "nmap -oG - " $1 " -p80," $2}' data | xargs -I % sh -c '%' | grep Ports
    
por 01.02.2014 / 19:29