How can I write a Linux bash script that tells me which computers are ON in my LAN?

前端 未结 16 1426
攒了一身酷
攒了一身酷 2020-12-12 11:59

How can I write a Linux Bash script that tells me which computers are ON in my LAN?

It would help if I could give it a range of IP addresses as input.

相关标签:
16条回答
  • 2020-12-12 12:39

    Although an old question, it still seems to be important (at least important enough for me to deal with this). My script relies on nmap too, so nothing special here except that ou can define which interface you want to scan and the IP Range is created automagically (at least kind of).

    This is what I came up with

    #!/bin/bash
    #Script for scanning the (local) network for other computers 
    
    command -v nmap >/dev/null 2>&1 || { echo "I require nmap but it's not installed. Aborting." >&2; exit 1; }
    
    if [ -n ""$@"" ];  then
        ip=$(/sbin/ifconfig $1 | grep 'inet '  | awk '{ print $2}' | cut -d"." -f1,2,3 )
        nmap -sP $ip.1-255
    else
        echo -e "\nThis is a script for scanning the (local) network for other computers.\n"
        echo "Enter Interface as parameter like this:"
        echo -e "\t./scannetwork.sh $(ifconfig -lu | awk '{print $2}')\n"
    
        echo "Possible interfaces which are up are: "   
        for i in $(ifconfig -lu)
        do
            echo -e "\033[32m \t $i \033[39;49m"
        done
    
        echo "Interfaces which could be used but are down at the moment: "
        for i in $(ifconfig -ld)
        do
            echo -e "\033[31m \t $i \033[39;49m"
        done
        echo
    fi
    

    One remark: This script is created on OSX, so there might be some changes to linux environments.

    0 讨论(0)
  • 2020-12-12 12:40

    The following (evil) code runs more than TWICE as fast as the nmap method

    for i in {1..254} ;do (ping 192.168.1.$i -c 1 -w 5  >/dev/null && echo "192.168.1.$i" &) ;done
    

    takes around 10 seconds, where the standard nmap

    nmap -sP 192.168.1.1-254
    

    takes 25 seconds...

    0 讨论(0)
  • 2020-12-12 12:42

    If you're limiting yourself to only having the last octet changing, this script should do it. It should be fairly obvious how to extend it from one to multiple octets.

    #! /bin/bash
    BASE=$1
    START=$2
    END=$3
    
    counter=$START
    
    while [ $counter -le $END ]
    do
      ip=$BASE.$counter
      if ping -qc 2 $ip
      then
        echo "$ip responds"
      fi
      counter=$(( $counter + 1 ))
    done
    
    0 讨论(0)
  • 2020-12-12 12:43

    Just for fun, here's an alternate

         #!/bin/bash
         nmap -sP 192.168.1.0/24 > /dev/null 2>&1 && arp -an | grep -v incomplete | awk '{print$2}' | sed -e s,\(,, | sed -e s,\),,
    

    0 讨论(0)
  • 2020-12-12 12:43
    #!/bin/bash
    
    for ((n=0 ; n < 30 ; n+=1))
    do
        ip=10.1.1.$n
        if ping -c 1 -w 1 $ip > /dev/null 2> /dev/null >> /etc/logping.txt; then  
            echo "${ip} is up" # output up
            # sintax >> /etc/logping.txt log with .txt format
        else
            echo "${ip} is down" # output down
        fi
    done
    
    0 讨论(0)
  • 2020-12-12 12:44

    Also using the "ping the broadcast address" method pointed out by chburd, this pipe should do the trick for you:

    ping -c 5 -b 10.11.255.255 | sed -n 's/.* \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' | sort | uniq
    

    Of course, you'd have to change the broadcast address to that of your network.

    0 讨论(0)
提交回复
热议问题