Falha IF em um loop WHILE no script BASH que verifica se há 22 portas abertas

1

Estou tentando criar um script básico para executar uma lista de servidores e verificar se a porta SSH está aberta usando nc . Eu tentei algumas maneiras diferentes, mas não consigo fazer isso funcionar. Eu definitivamente não sou bom em nenhum tipo de script.

Aqui está o script. Eu só quero que ele execute uma ação se ela for "bem-sucedida" na resposta do comando nc em OPEN .

while read SERVER
do
OPEN=$(nc -z -v -w5 $SERVER 22)
echo $SERVER
   if [[ $OPEN = *"suc"* ]];
    then
        echo "Found SSH open on $SERVER"
    else
        echo "No open ports on $SERVER!"    
   fi
done < server.txt

A lista de servidores está no arquivo server.txt que é referenciado no final do script.

Aqui está a resposta que recebo. Eu não

nc: connect to 10.10.51.55 port 22 (tcp) failed: No route to host
10.10.51.55
No open ports on test1!
Connection to 10.10.51.65 22 port [tcp/ssh] succeeded!
10.10.50.65
No open ports in test2!

Isso me dá o "Sem portas abertas em $ SERVER", não importa o quê.

Agradeço por qualquer orientação.

    
por saleetzo 11.05.2018 / 01:10

3 respostas

3

Notas, muito tempo para um comentário.

  1. server.txt poderia ser melhor nomeado server-list ou servers.txt se você desejar.

  2. Usar nomes de variáveis em minúsculas como, evite SERVER e similares, poderia ser melhor nomeado server_ip de qualquer maneira, porque não está claro se você usa nomes de host ou IPs.

  3. Cite duas vezes todas as variáveis de número não inteiro, como "$server_ip" .

  4. Use uma instrução if direta em vez da variável $OPEN com um redirecionamento para o buraco negro ( /dev/null ).

Reescrito com base no acima:

#!/bin/sh

while read server_ip
do

    if nc -z -v -w5 "$server_ip" 22 > /dev/null 2>&1
    then
        echo "Found SSH port open on $server_ip."
    else
        echo "Did not find open SSH port on $server_ip."
    fi

done < server-list
    
por 11.05.2018 / 03:55
3

A solução mais simples parece ser:

if nc -z -v -w5 $SERVER 22 >/dev/null 2>&1;
then
    echo "Found SSH open on $SERVER"
else
    echo "No open ports on $SERVER!"    
fi
    
por 11.05.2018 / 01:27
1

O problema é que nc grava em erro padrão ao enviar mensagens de diagnóstico, enquanto uma substituição de comando captura apenas a saída padrão.

Você também deve usar == in [[ ... ]] . Expansões variáveis devem ser citadas e, idealmente, você estaria usando printf para gerar dados variáveis.

Isso significa que você pode se parecer com o código

while read SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    if [[ "$OPEN" == *succ* ]]; then
        printf 'Found SSH open on %s'\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"    
    fi
done <server.txt

ou

while read SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    case "$OPEN" in
        *succ*) printf 'Found SSH open on %s'\n' "$SERVER" ;;
        *)      printf 'No open ports on %s!\n' "$SERVER"  ;;
    esac
done <server.txt

Você também pode usar o status de saída de nc :

while read SERVER do
    if nc -z -v -w5 "$SERVER" 22 >/dev/null 2>&1; then
        printf 'Found SSH open on %s'\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"
    fi
done <server.txt
    
por 11.05.2018 / 08:19