subnet ping scan in shell

Today I logged in a machine I don’t want to install anything on it, but I wanted to find a machine in its network.
I came up with the little shell script that scans the subnet:

CURR=1
SUBNET="192.168.0"

while [ $CURR -lt 255 ] ; do
  ping -c1 -t1 $SUBNET.$CURR 2>&1 >/dev/null
  if [ "$?" -eq "0" ]; then
    echo "$SUBNET.$CURR"
  fi
  let CURR=$CURR+1
done

This script is suboptimal but it does the stuff: It uses ping with a timeout of 1 sec, so If no machine is up, the script takes around 255 seconds to scan the subnet, it doesn’t list the machines that doesn’t reply to ping and so on … but as I said it , it does the stuff.

I tested this script in Linux and OSX.

13 Comments »

  1. FreedomSound said

    About 4min to scan subnet.. Waow.. Great Job πŸ˜‰

    Is -W option to speed up your script ?

  2. smaftoul said

    I think 4 minutes is slow ! πŸ™‚

    ‘-W’ is the timeout, I set the timeout to 1 sec , this is the minimum you can set !

  3. Billigflug said

    Looks like a nice one, I’ll give it a try tomorrow. I have to see and log and maybe then I can give you some suggestions to boost its speed a little.

  4. smaftoul said

    Hi Billigflug !
    I would be very happy if you make some suggestions !
    I would also be happy if it works for you, and don’t forget to tell me the os on which it works (or doesn’t) ! πŸ™‚

  5. federico cattozzi said

    I have edit the script and now it’s very fast!
    It uses parallel jobs to execute many pings at the same time.

    #!/bin/bash
    CURR=1
    SUBNET=”$1″
    FILE=multiping.log

    touch $FILE

    function multiping() {
    ping -c1 -t1 $SUBNET.$CURR 2>&1 >/dev/null
    if [ “$?” -eq “0” ]; then
    echo $(arp $SUBNET.$CURR) >> $FILE
    fi
    }

    while [ $CURR -lt 255 ] ; do
    multiping &
    let CURR=$CURR+1
    let MOD=$CURR%100
    #this code is for prevent the saturation of the executable connections
    if [[ $MOD -eq 0 ]]; then
    wait
    fi
    done
    wait
    cat $FILE
    rm $FILE

  6. federico cattozzi said

    Excuse me, i have forgotten the use:

    MacChicken:~ federico$ bash multiping.sh 192.168.1

    The only parameter is the subnet ip: 192.168.1 for example.
    I tested this script in Debian and MacOSX.
    Enjoy!

  7. Philipe said

    I have tried pasting both of these into Apple’s Script Editor but they don’t appear to work. What am I missing?

    • smaftoul said

      Philipe: it’s not applescript, it’s shell script.
      To use it, create a file with the script, launch a terminal, do chmod +x /path/to/filename_of_script and the execut: /path/to/filaname 192.168.0 for example. Hope this helps !

  8. thewrz said

    Did exactly what I needed. Thanks dude.

  9. eric said

    I think “ping -b ” can solve the problem easily.

    ping -b 192.168.18.255
    WARNING: pinging broadcast address
    PING 192.168.18.255 (192.168.18.255) 56(84) bytes of data.
    64 bytes from 192.168.18.108: icmp_seq=1 ttl=64 time=0.104 ms
    64 bytes from 192.168.18.105: icmp_seq=1 ttl=64 time=0.203 ms (DUP!)

    • smaftoul said

      Not every platform answers to a broadcast ping, but that may be a good start !

  10. john said

    um… has no one heard of nmap? It does exactly this and soooo much more.


    nmap -sP 192.168.1.0/24

    try it, if you don’t have it installed, shame on you!

    ;^)

  11. Gary said

    Cool script for an impatient Linux newb. We’re on Centos and added -w1 and it helped performance significantly.

    thx!

RSS feed for comments on this post · TrackBack URI

Leave a reply to Gary Cancel reply