Bash script to list all IPs in prefix

后端 未结 11 1630
[愿得一人]
[愿得一人] 2020-12-23 12:23

I\'m trying to create script that I can input a set of prefixes, which will then list all IP addresses within the prefixes (including network/host/broadcast).

An ex

11条回答
  •  盖世英雄少女心
    2020-12-23 13:21

    I recently wrote a function to generate all IP addresses from a given network address. The function takes the network address as argument and accepts CIDR and subnet masks. The script then stores all IPs in the array variable $ips.

    Code

    network_address_to_ips() {
      # create array containing network address and subnet
      local network=(${1//\// })
      # split network address by dot
      local iparr=(${network[0]//./ })
      # if no mask given it's the same as /32
      local mask=32
      [[ $((${#network[@]})) -gt 1 ]] && mask=${network[1]}
    
      # convert dot-notation subnet mask or convert CIDR to an array like (255 255 255 0)
      local maskarr
      if [[ ${mask} =~ '.' ]]; then  # already mask format like 255.255.255.0
        maskarr=(${mask//./ })
      else                           # assume CIDR like /24, convert to mask
        if [[ $((mask)) -lt 8 ]]; then
          maskarr=($((256-2**(8-mask))) 0 0 0)
        elif  [[ $((mask)) -lt 16 ]]; then
          maskarr=(255 $((256-2**(16-mask))) 0 0)
        elif  [[ $((mask)) -lt 24 ]]; then
          maskarr=(255 255 $((256-2**(24-mask))) 0)
        elif [[ $((mask)) -lt 32 ]]; then
          maskarr=(255 255 255 $((256-2**(32-mask))))
        elif [[ ${mask} == 32 ]]; then
          maskarr=(255 255 255 255)
        fi
      fi
    
      # correct wrong subnet masks (e.g. 240.192.255.0 to 255.255.255.0)
      [[ ${maskarr[2]} == 255 ]] && maskarr[1]=255
      [[ ${maskarr[1]} == 255 ]] && maskarr[0]=255
    
      # generate list of ip addresses
      local bytes=(0 0 0 0)
      for i in $(seq 0 $((255-maskarr[0]))); do
        bytes[0]="$(( i+(iparr[0] & maskarr[0]) ))"
        for j in $(seq 0 $((255-maskarr[1]))); do
          bytes[1]="$(( j+(iparr[1] & maskarr[1]) ))"
          for k in $(seq 0 $((255-maskarr[2]))); do
            bytes[2]="$(( k+(iparr[2] & maskarr[2]) ))"
            for l in $(seq 1 $((255-maskarr[3]))); do
              bytes[3]="$(( l+(iparr[3] & maskarr[3]) ))"
              printf "%d.%d.%d.%d\n" "${bytes[@]}"
            done
          done
        done
      done
    }
    

    Example

    network_address_to_ips 10.0.1.0/255.255.255.240
    network_address_to_ips 10.1.0.0/24
    

提交回复
热议问题