Как я могу создать с bash все возможные комбинации IP-адресов? - PullRequest
0 голосов
/ 24 апреля 2020

Это будет вывод:

0.0.0.0
0.0.0.1
0.0.0.2
.
.
.
.
255.255.255.253
255.255.255.254
255.255.255.255

Возможно, мне нужно будет сохранить его в файл, но я легко могу сделать это с помощью оператора >

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Ну, если бы bash мог с этим справиться, это выражение сработало бы:

echo {0..255}.{0..255}.{0..255}.{0..255} | tr ' ' \\n

Но вышеприведенное выражение расширяется на bash, и в результате 4 миллиарда IP взрывают оболочку. Скорее, вы можете просто написать вложенные циклы следующим образом:

for octet1 in {0..255}
do
  for octet2 in {0..255}
  do
    for octet3 in {0..255}
    do
      for octet4 in {0..255}
      do
        echo $octet1.$octet2.$octet3.$octet4
      done
    done
  done
done

Вы также можете сократить это немного так:

for octet12 in {0..255}.{0..255}
do
  for octet34 in {0..255}.{0..255}
  do
    echo $octet12.$octet34
  done
done
1 голос
/ 24 апреля 2020

Как правило, язык bash обладает достаточной мощностью для управления IP-адресами. У меня есть небольшой набор функций, которые я использую для математики IP, которыми я могу поделиться с вами для более общей работы над IPv4. Вот код, использующий мою библиотеку функций IP. ТБХ: Я называю это «моей библиотекой», но я уверен, что поднял ее у другого разработчика лет go, но я потерял атрибуцию.

Итак, вот код:

ip_range "0.0.0.0" "255.255.255.255" 1

А вот и набор функций:

#!/usr/bin/env bash

function ip2value() { 

local ip=$1 # IP address to convert to decimal
local sum=0

IFS='.' read -ra ADDR <<< "$ip"
for i in "${ADDR[@]}"; do
    sum=$(( sum * 256 + i )) 
done
echo $sum
}

function value2ip() { 

local value=$1
local ip=""
local divisor=$(( 256 ** 3 )) 

for x in 0 1 2  
do
    ip="$ip.$(( value / divisor ))"
    value=$(( value % divisor ))
    divisor=$(( divisor / 256 )) 
done

ip=${ip#.}
ip=$ip.$value
echo $ip
}


# Usage:  addIP <ip> [<count>]
# Increase <ip> by <count> ( default 1)
function nextIP() {
  local IP=$1
    local COUNT=$2
  : ${COUNT:=1}
    value2ip $(( $COUNT + $( ip2value $1 ) )) 
}

function addIPs() {
  local IP1=$1
  local IP2=$2

  value2ip $(( $( ip2value $IP1 ) + $( ip2value $IP2 ) ))
}

function isIP() {
  local IP=$1
  local VALUE=$( ip2value $IP )
  local VIP=$( value2ip $VALUE ) 

  [ "$IP" == "$VIP" ] 
}

function ip_range() { 
  local FIRST=$1
  local LAST=$2
  local STEP=$3

  : ${STEP:=1}

  local ip=$(ip2value $FIRST)
  local last=$(ip2value $LAST)

  while 
   [ $ip -le $last ] 
  do
   echo $( value2ip $ip )
   ip=$(( ip + 1 ))
  done
}
...