script para varrer o intervalo de ip e retornar resultados em um determinado formato

2

Este script varre os IPs e retorna um status Up ou Down. Como posso alterá-lo para não verificar tudo duas vezes? À medida que se senta, ele verifica tudo e retorna os endereços "Para cima" apenas e, em seguida, varre tudo novamente e retorna apenas os endereços de status "Para baixo".

#!/bin/bash

is_alive_ping()
{
  ping -c 1 $1 > /dev/null
  [ $? -eq 0 ] && echo $i,Up
  [ $? -eq 1 ] && echo $i,Down
}

for i in 10.1.150.{1..10}
do
is_alive_ping $i & disown
done

Pontos de bônus, se alguém puder fazer isso, também retornará o nome DNS do IP, se tiver um.

Obrigado antecipadamente.

    
por LVLAaron 03.01.2012 / 16:54

5 respostas

1

O script varre cada IP apenas uma vez. A verificação está acontecendo em segundo plano ( & ). O baixo IP leva mais tempo para responder, e é por isso que eles são relatados mais tarde.

    
por 03.01.2012 / 17:12
3

Você está procurando pelo nmap .

# nmap -sP 10.1.150.1-10
Starting Nmap 5.00 ( http://nmap.org ) at 2012-01-04 00:02 CET
Host foo.example.com (10.1.150.2) is up (0.00066s latency).
Host bar.example.com (10.1.150.7) is up (0.00066s latency).
Nmap done: 10 IP addresses (1 host up) scanned in 1.41 seconds
    
por 04.01.2012 / 00:04
0

O ping tenta novamente para nós não respondidos, o que aumenta a latência em relatar a disponibilidade dos nós de volta à saída do console, enquanto os nós online atendidos são reportados imediatamente de volta. ping tem essa desvantagem que você precisa executá-lo para cada host.

Use o fping, uma alternativa melhor ao ping, que pode fazer um ping paralelo nos hosts, a fonte está disponível no link do sourceforge. Faça o download do fps e instale-o em / usr / local / sbin e torne-o suid.

Aqui está um exemplo de perl, que pode relatar os nós inacessíveis no final, enquanto os nós on-line são relatados com seus nomes de dns, você pode passar a saída desse script para ferramentas como grep ou awk novamente para trabalhar na saída desejada.

#!/usr/bin/perl
require 'open2.pl';
use Net::IP;

$pid = &open2("OUTPUT","INPUT","/usr/local/sbin/fping -d");

@check=();

my $ip = new Net::IP ('98.137.149.56 - 98.137.149.100') || die "Unable to generate range\n";

do {
    push (@check, $ip->ip());
} while (++$ip);


foreach(@check) { print INPUT "$_\n"; }

close(INPUT);

while(<OUTPUT>) {
  print "$_";
}

close(OUTPUT);
    
por 03.01.2012 / 17:20
0

Se você deseja manter o pedido, você deve redirecionar a saída para não stdout, mas para arquivos. Depois que todos os pings estiverem concluídos, execute wait para aguardar a conclusão do último processo de segundo plano. Em seguida, coloque os arquivos de resultados na ordem "correta".

    
por 03.01.2012 / 21:58
0

adicionar -w a ping permitirá que o processo seja muito mais rápido.

#!/bin/bash

is_alive_ping()
{
  ping -c 1 -w 1 $1 > /dev/null
  [ $? -eq 0 ] && echo $i ,Alive
}

for i in 192.168.213.{1..254}
do
is_alive_ping $i &
done
    
por 19.09.2014 / 22:29