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.
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.
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
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);
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".
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
Tags networking ip shell shell-script