#!/bin/bash # Check if the subnet argument is provided if [ "$#" -ne 1 ]; then echo "Usage: $0 " exit 1 fi # Extract the base IP and CIDR from the argument subnet="$1" IFS='.' read -r -a octets <<< "$(echo "$subnet" | cut -d'/' -f1)" cidr=$(echo "$subnet" | cut -d'/' -f2) # Function to ping a single IP ping_host() { ip="$1" if ping -c 1 -W 1 "$ip" &> /dev/null; then echo "$ip is up" fi } # Export the function so it can be used by GNU Parallel export -f ping_host # Generate IPs based on CIDR if [ "$cidr" -eq 24 ]; then # For /24, only the last octet changes for i in {1..254}; do ip="${octets[0]}.${octets[1]}.${octets[2]}.$i" echo "$ip" done elif [ "$cidr" -eq 16 ]; then # For /16, the last two octets change for i in {0..255}; do for j in {0..255}; do if [ "$i" -eq 0 ] && [ "$j" -eq 0 ]; then continue # Skip network address fi if [ "$i" -eq 255 ] && [ "$j" -eq 255 ]; then continue # Skip broadcast address fi ip="${octets[0]}.${octets[1]}.$i.$j" echo "$ip" done done else echo "Unsupported CIDR notation. Only /24 and /16 are supported in this script." exit 1 fi | parallel -j 512 --progress ping_host echo "Scan completed."