Por que este snippet de shell para verificar se os hosts estão usando o netcat stop prematuramente?

4

P: Por que a segunda iteração sai após 10.175.192.16? Alguém pode explicar isso? Ou acabei de encontrar um bug "while / netcat"?

conteúdo do a.txt:

$ cat a.txt 
10.175.192.14
10.175.192.16
10.175.192.17
$

Primeira iteração, tudo bem, apenas mostra o conteúdo do arquivo:

$ while read oneline; do echo $oneline; done < a.txt 
10.175.192.14
10.175.192.16
10.175.192.17
$

Segunda iteração, isso é ruim, existe quando chegar a 10.175.192.16:

$ while read oneline; do nc -w 3 "$oneline" 22 >& /dev/null; echo $oneline; done < a.txt 
10.175.192.14
10.175.192.16
$

Códigos de saída:

$ nc -w 3 "10.175.192.14" 22 >& /dev/null; echo $?
1
$ nc -w 3 "10.175.192.16" 22 >& /dev/null; echo $?
0

Portanto, não há servidor SSH atrás de 10.175.192.14. Mas há um atrás de 10.175.192.16. Mas a iteração "while" não deveria sair antes de passar por todas as linhas, não? Por que falta 10.175.192.17? O que eu sinto falta aqui?

Meu objetivo principal é que eu estou tendo um arquivo (a.txt) que contém endereços IP. Eu preciso classificar esses endereços IP em dois arquivos:

 A) Os que estão acessíveis (o ssh está avisando, então o servidor está disponível)
 B) Os que não estão acessíveis (tempo limite após 3 segundos, porque não há nada escutando na porta 22)

"alcançável" significa que há algo escutando na porta 22 atrás do IP.

    
por LanceBaynes 26.01.2012 / 04:26

2 respostas

3

Acho que tenho uma resposta: quando nc tenta um endereço IP que tem um servidor escutando na porta 22 (que normalmente é o servidor SSH), ele lê o restante da entrada e passa para o servidor na porta 22 O servidor SSH que estou executando em minhas máquinas domésticas apenas come a entrada.

O nc que tenho (sistema Slackware 13.1) tem uma opção "-z", para "zero I / O". Experimente

nc -z -w 3 "$oneline" >& /dev/null

como o comando no seu loop while. Eu acho que existem outras implementações de nc . Existe um netcat do GNU por exemplo, mas também é necessária uma opção "-z".

    
por 26.01.2012 / 04:55
1

Pode ser que você tenha algum símbolo especial no final de 10.175.192.16? Você poderia tentar analisar o arquivo sem o comando 'read':

HOSTS='cat a.txt'
for host in $HOSTS; do 
    code='nc -w 3 -z "$host" 22 >& /dev/null; echo $?'
    if [ "$code" == "0" ]; then 
        echo $host >> reachable.txt
    else
        echo $host >> unreachable.txt
    fi
done
    
por 26.01.2012 / 04:46