Nmap verifica se a porta está aberta no bash

1

Eu quero fazer um script que irá verificar se uma porta está aberta em um servidor. Se não abrir ficar por um tempo. Se aberto, continue. As condições de quebra são use se "host está para cima" estiver presente e não "fechado". Eu suponho que a condição é boa. O problema é que o grep não está funcionando como esperado.

Eu tentei com o seguinte:

while true; do
 NMAP=$(nmap -p 1700 router.eu.thethings.network)
 if [[$NMAP | grep "Host is up" -ne ""]] && [[$NMAP | grep "closed" -eq ""]]; then
    echo "connection!!!"
    break
 fi


 echo "waiting for connectiong"
 done

Eu o executo em um sistema de piessie jessie de framboesa.

    
por Peter Savnik 08.08.2017 / 14:42

3 respostas

1

O problema é que [[$NMAP | grep "Host is up" -ne ""]] está muito longe da sintaxe bash válida. As mensagens de erro não dizem exatamente como consertá-lo, mas são um indício de que algo está seriamente errado.

Para testar se uma string contém uma substring, você pode usar o operador == em uma expressão condicional, ou um pipe através do grep (o que não envolvem uma expressão condicional). Com grep, você não está executando $NMAP como um comando, você quer passar isso como entrada para o grep, então você precisa echo no pipe. Passe -q para grep, já que você só se importa com o status de retorno, não sobre sua saída.

if echo "$NMAP" | grep "Host is up"  && echo "$NMAP" | grep "closed"; then …

Com uma expressão condicional:

if [[ $NMAP == *"Host is up"* || $NMAP == *"closed"* ]]; then …

Leia Confuso sobre os operadores [[vs [vs ( vs ((, que explica sobre expressões condicionais e como elas não são a única maneira de testar se uma condição é verdadeira. Além disso, leia Por que o meu shell script engasgar em espaço em branco ou outros caracteres especiais?

    
por 09.08.2017 / 01:38
3
nmap -p 1700 router.eu.thethings.network

Será impresso "O host está ativo" se a rede do host estiver ativa e não houver nada escutando na porta.

Use o nc que está disponível no jesse

if nc -z router.eu.thethings.network 1700; then
  echo "Port is listening"
else
  echo "Port is not listening"
fi
    
por 08.08.2017 / 15:01
0

Há um exemplo para exibir Host is up quando grep success e Host is down quando grep retornar nada:

NMAP=$(nmap -p 1700 router.eu.thethings.network)
(NMAP$ | grep "Host is up") &>/dev/null && echo "Host is up" || echo "Host is down"
    
por 08.08.2017 / 16:12