Enviar um ping para cada IP numa sub-rede
for(int i = 1; i < 254; i++)
ping(192.168.1.i);
Para fazer cumprir a resolução arp?
14 answers
Eu sugeriria o uso defping com a opção máscara, uma vez que você não está restringindo a si mesmo em ping.
fping -g 192.168.1.0/24
A resposta será fácil de processar num script:
192.168.1.1 is alive
192.168.1.2 is alive
192.168.1.3 is alive
192.168.1.5 is alive
...
192.168.1.4 is unreachable
192.168.1.6 is unreachable
192.168.1.7 is unreachable
...
Nota: Se usar o argumento -a
irá restringir o resultado aos endereços ip alcançáveis, poderá querer usá-lo caso contrário a reprodução também irá imprimir os endereços inacessíveis:
fping -a -g 192.168.1.0/24
Do Homem:
Fping difere de ping na medida em que pode indicar qualquer número objectivos na linha de comandos, ou especificar um ficheiro que contenha as listas de alvos pingar. Em vez de enviar para um alvo até ele sair ou Respostas, o fping irá enviar um pacote de ping e passar para o seguinte alvo de uma forma rotineira.
Mais informações: http://fping.org/
Nem todas as máquinas têm nmap
disponível, mas é uma ferramenta maravilhosa para qualquer descoberta de rede, e certamente melhor do que iterar através de comandos independentes ping
.
$ nmap -n -sP 10.0.0.0/24 Starting Nmap 4.20 ( http://insecure.org ) at 2009-02-02 07:41 CST Host 10.0.0.1 appears to be up. Host 10.0.0.10 appears to be up. Host 10.0.0.104 appears to be up. Host 10.0.0.124 appears to be up. Host 10.0.0.125 appears to be up. Host 10.0.0.129 appears to be up. Nmap finished: 256 IP addresses (6 hosts up) scanned in 2.365 seconds
Mensagem de transmissão:
$ ping 192.168.1.255
PING 192.168.1.255 (192.168.1.255): 56 data bytes
64 bytes from 192.168.1.154: icmp_seq=0 ttl=64 time=0.104 ms
64 bytes from 192.168.1.51: icmp_seq=0 ttl=64 time=2.058 ms (DUP!)
64 bytes from 192.168.1.151: icmp_seq=0 ttl=64 time=2.135 ms (DUP!)
...
(Adicionar uma opção -b
no Linux)
In Bash shell:
#!/bin/sh
COUNTER=1
while [ $COUNTER -lt 254 ]
do
ping 192.168.1.$COUNTER -c 1
COUNTER=$(( $COUNTER + 1 ))
done
O utilitário nmap da linha de comandos também pode fazer isto:
nmap -sP 192.168.1.*
Esta é uma modificação da resposta @david-rodríguez-dribeas acima, que executa todos os pings em paralelo (muito mais rápido) e só mostra o resultado dos endereços ip que devolvem o ping.
export COUNTER=1
while [ $COUNTER -lt 255 ]
do
ping $1$COUNTER -c 1 -w 400 | grep -B 1 "Lost = 0" &
COUNTER=$(( $COUNTER + 1 ))
done
echo $(seq 254) | xargs -P255 -I% -d" " ping -W 1 -c 1 192.168.0.% | grep -E "[0-1].*?:"
- Vantagem 1: não precisa de instalar nenhuma ferramenta adicional Vantagem 2: é rápido. Ele faz tudo em paralelo com um timout para cada ping de 1s ("
- Vantagem 3: a saída é assim
-W 1
"). Então terminará em 1s:)
64 bytes from 192.168.0.16: icmp_seq=1 ttl=64 time=0.019 ms 64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=1.78 ms 64 bytes from 192.168.0.21: icmp_seq=1 ttl=64 time=2.43 ms 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=1.97 ms 64 bytes from 192.168.0.11: icmp_seq=1 ttl=64 time=619 ms
Editar: E aqui está o mesmo que script, para quando seus xargs não têm a bandeira-P, Como é the case in openwrt (I just found out)
for i in $(seq 255);
do
ping -W 1 -c 1 10.0.0.$i | grep 'from' &
done
for i in $(seq 1 254); do ping -c1 -t 1 192.168.11.$i; done
Adicionar um -t 1
espera apenas um segundo antes de sair. Isso melhora muito a velocidade se você tiver apenas alguns dispositivos conectados a essa sub-rede.
FOR /L %i in (1,1,254) DO PING 192.168.1.%i -n 1 -w 100 | for /f "tokens=3 delims=: " %j in ('find /i "TTL="') do echo %j>>IPsOnline.txt
No linux, acho que o ping-b 192.168.1.255 vai funcionar (192.168.1.255 é o endereço de transmissão para 192.168.1.* ) no entanto, IIRC que não funciona sob o windows.
Verifique se este post tem o que precisa.
#!/bin/sh
COUNTER=$1
while [ $COUNTER -lt 254 ]
do
echo $COUNTER
ping -c 1 192.168.1.$COUNTER | grep 'ms'
COUNTER=$(( $COUNTER + 1 ))
done
#specify start number like this: ./ping.sh 1
#then run another few instances to cover more ground
#aka one at 1, another at 100, another at 200
#this just finds addresses quicker. will only print ttl info when an address resolves
# Declare Variables
$MyIpAddress
$MyIpAddressLast
# Declare Variable And Get User Inputs
$IpFirstThree=Read-Host 'What is the first three octects of you IP addresses please include the last period?'
$IpStart=Read-Host 'Which IP Address do you want to start with? Include NO periods.'
$IpEnd=Read-Host 'Which IP Address do you want to end with? Include NO periods.'
$SaveMyFilePath=Read-Host 'Enter the file path and name you want for the text file results.'
$PingTries=Read-Host 'Enter the number of times you want to try pinging each address.'
#Run from start ip and ping
#Run the arp -a and output the results to a text file
#Then launch notepad and open the results file
Foreach($MyIpAddressLast in $IpStart..$IpEnd)
{$MyIpAddress=$IpFirstThree+$MyIpAddressLast
Test-Connection -computername $MyIpAddress -Count $PingTries}
arp -a | Out-File $SaveMyFilePath
notepad.exe $SaveMyFilePath
for i in $(seq 1 254); do ping -c1 192.168.11.$i; done