LINUX.ORG.RU

Генерация списка IP

 


0

1

Привет!

Есть необходимость на BASH генерировать список IPшников из такого формата: X.X.X.X/X

т.е. я ему (скрипту) 192.168.0.0/29, а он мне: 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5 192.168.0.6

Подскажите, плиз)



Последнее исправление: slevinkelevra (всего исправлений: 2)

Ответ на: комментарий от init_6

я начал с этого:

ipcalc -b 192.168.0.0/16 | egrep 'HostMin|HostMax'

HostMin: 192.168.0.1

HostMax: 192.168.255.254

Но вот не знаю как заставить работать цикл, если октеты разные (

поэтому и прошу помощи

slevinkelevra
() автор топика
Ответ на: комментарий от slevinkelevra

Собрать IP в одно число и цикл по нему, при выводе разбивать снова на октеты, либо при маске больше 8/16/24 организовывать соответсвенное количество вложенных циклов.

Elyas ★★★★★
()
Ответ на: комментарий от slevinkelevra

Но вот не знаю как заставить работать цикл, если октеты разные (

Тебе показать циклы в ABSG ? :)

У тебя в твоём конкретном примере их будет по крайней мере 2: один вложенный от 1 до 254 второй основной от 0 до 255

init_6 ★★★★★
()
Ответ на: комментарий от i_gnatenko_brain

не пугай человека. ему в циклах проще awk юзать

Да не важно… Я вот чего не пойму если вопрос в том «а как?» так вроде понятно… Если в том что нечто конкретно не работает так он не показывает что. Иначе же это вообще не тут а в Job должно быть.

init_6 ★★★★★
()

Ну сделал

#!/bin/bash
hostmin=$(ipcalc -b $1 | egrep 'HostMin' | gawk '{print $2}')
hostmax=$(ipcalc -b $1 | egrep 'HostMax' | gawk '{print $2}')

#echo -e "$hostmin"
#echo -e "$hostmax"

mino1=$(echo $hostmin  | gawk -F. '{print $1}')
mino2=$(echo $hostmin  | gawk -F. '{print $2}')
mino3=$(echo $hostmin  | gawk -F. '{print $3}')
mino4=$(echo $hostmin  | gawk -F. '{print $4}')

maxo1=$(echo $hostmax  | gawk -F. '{print $1}')
maxo2=$(echo $hostmax  | gawk -F. '{print $2}')
maxo3=$(echo $hostmax  | gawk -F. '{print $3}')
maxo4=$(echo $hostmax  | gawk -F. '{print $4}')


#echo -e $mino1 $mino2 $mino3 $mino4
#echo -e $maxo1 $maxo2 $maxo3 $maxo4

for mo1 in `seq $mino1 $maxo1`
    do
<------>for mo2 in `seq $mino2 $maxo2`
<------>    do
<------><------>for mo3 in `seq $mino3 $maxo3`
<------><------>    do
<------><------><------>for mo4 in `seq $mino4 $maxo4`
<------><------><------>    do
<------><------><------><------>echo "$mo1.$mo2.$mo3.$mo4"
done
done
done
done

посоветуйте как и что можно упростить))

slevinkelevra
() автор топика
Ответ на: комментарий от slevinkelevra

ipcalc ты уже подключил, дальше case и счётчик по октетам, мелкие детали скучны и неинтересны...

% for i in 192.168.{0..255}.{0..254};echo $i
192.168.0.0
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
...

zolden ★★★★★
()
Ответ на: комментарий от Elyas

Я б так сделал

apt-get install python-netaddr

А потом,

cat ipcalc.py

import sys
from netaddr import IPNetwork
for ip in IPNetwork(sys.argv[1]):
	print '%s' % ip

python ipcalc.py  192.168.1.0/29
192.168.1.0
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
pyatak123
()
Ответ на: комментарий от AS
$ perl -MSocket -wE 'say unpack "N", inet_aton ("192.168.0.0");'
3232235520
$ perl -MSocket -wE 'say inet_ntoa pack "N", 3232235520;'
192.168.0.0
AS ★★★★★
()
Последнее исправление: AS (всего исправлений: 2)
Ответ на: Ну сделал от slevinkelevra

Можно вместо 10 запусков awk обойтись только одним. (Работоспособность не проверял, т.к. на моей системе формат вывода ipcalc отличается.)

#!/bin/sh

ipcalc -b $1 | awk '
/HostMin/ { min = $2 }
/HostMax/ { max = $2 }

END {
    FS = OFS = "."
    $0 = min
    for (i = 1; i <= 4; i++)
        amin[i] = $i
    $0 = max
    for (i = 1; i <= 4; i++)
        amax[i] = $i

    for (o1 = amin[1]; o1 <= amax[1]; o1++)
        for (o2 = amin[2]; o2 <= amax[2]; o2++)
            for (o3 = amin[3]; o3 <= amax[3]; o3++)
                for (o4 = amin[4]; o4 <= amax[4]; o4++)
                    print o1, o2, o3, o4
}'
unterwulf
()
$ perl -e 'my($t,$n)=split"/",shift;$n=32-$n;$t=unpack"N",pack"C4",split/\./,$t;$t&=-1<<$n;printf"%d.%d.%d.%d\n",unpack"C4",pack"N",$t+$_ for 1..(1<<$n)-2' 192.168.0.0/29
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
192.168.0.5
192.168.0.6
$ _
arsi ★★★★★
()
Ответ на: Ну сделал от slevinkelevra

Если адресов много, то на баше может долго получиться, лучше как выше awk / python, just for fun:

#!/bin/bash

ipcalc() {
  cat << EOF
HostMin: 192.168.0.1
HostMax: 192.168.255.254
EOF
}


iter() {
  # `local' is non-POSIX
  local sofar=$1
  [ -z $2 ] && echo ${sofar#.} && return

  from=$2 to=$3
  shift 3

  for i in $(seq $from $to); do
    iter $sofar.$i $@
  done
}


# columns from autotools
iter "" $(ipcalc | cut -d' ' -f2 | tr . '\n' | columns --by-columns -c2)
anonymous
()
Ответ на: комментарий от pyatak123

Это читерство (шутка, если что)

ipcalc | grep 'HostMin\|HostMax' | awk '{print $2}' | tr . ' ' | ghc -e '
  interact
    $ unlines   . map (intercalate "." . map show)
    . sequence  . map (\[a,b] -> enumFromTo (a::Int) b)
    . transpose . map (map read . words) . lines
'
anonymous
()
Ответ на: комментарий от pyatak123

Зачет!

Круто! Самое простое и самое крутое решение! Спасибо )

slevinkelevra
() автор топика
Ответ на: комментарий от ei-grad

/me удивлен что у nmap нет опции чтобы исключить IP адреса сети и broadcast из списка по CIDR нотации...

ei-grad ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.