Send a ping to each IP on a subnet

NetworkingShellPingArp

Networking Problem Overview


Is there a command line based way to send pings to each computer in a subnet? Like

for(int i = 1; i < 254; i++)
    ping(192.168.1.i);

to enforce arp resolution?

Networking Solutions


Solution 1 - Networking

Not all machines have nmap available, but it's a wonderful tool for any network discovery, and certainly better than iterating through independent ping commands.

$ 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

Solution 2 - Networking

I would suggest the use of fping with the mask option, since you are not restricting yourself in ping.

fping -g 192.168.1.0/24

The response will be easy to parse in a 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
...

Note: Using the argument -a will restrict the output to reachable ip addresses, you may want to use it otherwise fping will also print unreachable addresses:

fping -a -g 192.168.1.0/24

From man:

> fping differs from ping in that you can specify any number of targets > on the command line, or specify a file containing the lists of targets > to ping. Instead of sending to one target until it times out or > replies, fping will send out a ping packet and move on to the next > target in a round-robin fashion.

More info: http://fping.org/

Solution 3 - Networking

Broadcast ping:

$ 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!)
...

(Add a -b option on Linux)

Solution 4 - Networking

In Bash shell:

#!/bin/sh

COUNTER=1

while [ $COUNTER -lt 254 ]
do
   ping 192.168.1.$COUNTER -c 1
   COUNTER=$(( $COUNTER + 1 ))
done

Solution 5 - Networking

I just came around this question, but the answers did not satisfy me. So i rolled my own:

echo $(seq 254) | xargs -P255 -I% -d" " ping -W 1 -c 1 192.168.0.% | grep -E "[0-1].*?:"
  • Advantage 1: You don't need to install any additional tool
  • Advantage 2: It's fast. It does everything in Parallel with a timout for every ping of 1s ("-W 1"). So it will finish in 1s :)
  • Advantage 3: The output is like this

> 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

Edit: And here is the same as script, for when your xargs do not have the -P flag, as is 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

Solution 6 - Networking

The command line utility nmap can do this too:

nmap -sP 192.168.1.*

Solution 7 - Networking

for i in $(seq 1 254); do ping -c1 -t 1 192.168.11.$i; done

Adding a -t 1 waits only one second before exiting. This improves the speed a lot if you just have a few devices connected to that subnet.

Solution 8 - Networking

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

Solution 9 - Networking

This is a modification of @david-rodríguez-dribeas answer above, which runs all the pings in parallel (much faster) and only shows the output for ip addresses which return the 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

Solution 10 - Networking

Under linux, I think ping -b 192.168.1.255 will work (192.168.1.255 is the broadcast address for 192.168.1.*) however IIRC that doesn't work under windows.

Solution 11 - Networking

I came late but here is a little script I made for this purpose that I run in Windows PowerShell. You should be able to copy and paste it into the ISE. This will then run the arp command and save the results into a .txt file and open it in notepad.

# 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

Solution 12 - Networking

#!/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

Solution 13 - Networking

This Script works well in OpenWRT

In a new file put this code ,

#!/bin/sh
echo "Online IPs" > out.txt
COUNTER=1

while [ $COUNTER -lt 255 ]
do
 ping $1.$COUNTER -c 1 -w 400 | grep "time" >> out.txt &
 COUNTER=$(( $COUNTER + 1 ))
done
killall ping

Set execution permision and launch it

root@r1:/# nping 192.168.1

then view all host connected in out.txt file

Solution 14 - Networking

for i in $(seq 1 254); do ping -c1 192.168.11.$i; done

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionbot47View Question on Stackoverflow
Solution 1 - NetworkingTomView Answer on Stackoverflow
Solution 2 - NetworkingKyrView Answer on Stackoverflow
Solution 3 - NetworkingRyan McGearyView Answer on Stackoverflow
Solution 4 - NetworkingDavid Rodríguez - dribeasView Answer on Stackoverflow
Solution 5 - NetworkingzabeltechView Answer on Stackoverflow
Solution 6 - NetworkingChristian StuderView Answer on Stackoverflow
Solution 7 - NetworkingJKalokView Answer on Stackoverflow
Solution 8 - NetworkingPCFixerGuyView Answer on Stackoverflow
Solution 9 - NetworkingAdam BrownView Answer on Stackoverflow
Solution 10 - NetworkingAxelle ZieglerView Answer on Stackoverflow
Solution 11 - Networkingcxp cxdView Answer on Stackoverflow
Solution 12 - NetworkingChristopher InfanteView Answer on Stackoverflow
Solution 13 - NetworkingSergi PerezView Answer on Stackoverflow
Solution 14 - NetworkingusbdongleView Answer on Stackoverflow