Bash Ping para retornar endereços IP 'vivos'

0

(Disclaimer- Eu sei que isso pode ser feito mais facilmente com nmap , mas supostamente é uma prática para scripts do shell bash).

$ scriptname 192.168.42 18 23 

Checking: 192.168.42.18 19 20 21 22 23 

Live hosts: 
 192.168.42.21 
 192.168.42.22 

There were: 
 5 alive hosts 
 1 not alive hosts 
 found through the use of 'ping'. 

Acima é o que eu quero que a saída seja semelhante. 'Checking: ...' irá listar o IP que estiver sendo verificado. Todos os Live serão listados em "Live Hosts" e, em seguida, executando totais para vivo e não-vivo.

Aqui está o que eu tenho até agora

for i in 'seq ${2} ${3}'    
do
    ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
    if [ $? -eq 0 ]; then
        echo "Live hosts: \n ${1}.${i}"; LIVECOUNT=$( ???? )
    fi
done

O LIVECOUNT=$( ???? ) porque não sei o que colocar nele. Não tenho certeza de como manter um total de corridas para os vivos / não vivos. As seções "Live Hosts" e "There were" não precisam aparecer até que a verificação seja concluída.

    
por Lacey 21.04.2014 / 08:46

1 resposta

1

A resposta curta para sua primeira pergunta é LIVECOUNT=$((LIVECOUNT+1)) . Esta expansão aritmética, mostrada por double parens: $ (()), para incrementar a variável LIVECOUNT por um cada vez que o comando ping retornar 0 para o sucesso.

A resposta curta para descobrir o número total de hosts é subtrair o endereço inferior ($ {2}) do endereço superior ($ {3}) e adicionar um para obter o total de hosts.

Então:

#!/bin/bash
CHECKING=${1}.
LIVEHOSTS=""
LIVECOUNT=0
TOTALHOSTS=$(($3 - $2 + 1))
for i in 'seq ${2} ${3}'
do
    CHECKING="$CHECKING${i} "
    ping -c 1 -t 1 ${1}.${i} > /dev/null 2>&1;
    if [ $? -eq 0 ]; then
        LIVEHOSTS="$LIVEHOSTS \n ${1}.${i}"
        LIVECOUNT=$((LIVECOUNT+1))
    fi
done
echo ""
echo "Checking: $CHECKING"
echo ""
echo "Live hosts:"
echo -e "$LIVEHOSTS"
echo ""
echo "There were:"
echo "$LIVECOUNT alive hosts"
echo "$((TOTALHOSTS - $LIVECOUNT)) not alive hosts"
echo "found through the use of ping"

Observe o seguinte: $ CHECKING é uma string que começa com a sub-rede fornecida como parâmetro 1 $ {1} e, em seguida, adiciona o número do host atual $ {i} para cada iteração do loop do.

Por causa da forma como você tem este formato (com a linha "Checking:" à frente da linha "Live hosts:") parecia mais fácil manter os hosts ao vivo em uma string (semelhante a $ CHECKING), então é isso que $ LIVEHOSTS é.

$ LIVEHOSTS e $ LIVECOUNT são inicializados em branco e zero para deixar claro o que está acontecendo; isso não é estritamente falando, necessário.

Observe o uso de echo -e quando $ LIVEHOSTS é produzido. Isso é para fazer o \ n funcionar como uma nova linha.

EDIT: Para mostrar qual IP está atualmente sendo verificado e não uma lista no final, substitua CHECKING="$CHECKING${i} " por echo "Checking $CHECKING${i}" e exclua ou comente a linha echo "Checking: $CHECKING" . Como o echo é dentro do loop do , ele será impresso em cada passagem, usando o valor atual de $ i. (Esta é a mesma coisa que @slm apontou sobre seu uso de echo "Live hosts" em seu script original.)

Espero que isso ajude.

    
por 21.04.2014 / 15:14

Tags