LINUX.ORG.RU

Генератор списка IP-адресов

 


0

1

Голова кипит, мозги не варят. Пытаюсь второй день состряпать генератор списка IP-адресов на shell'е. Ничего путёвого не выходит. Может у кого-то есть готовое решение? Суть такова: надобно скормить скрипту диапазон, например: 10.0.0.1 - 10.0.10.100, а он должен преобразовать его в список адресов, входящих в этот диапазон. Может кто-нибудь подскажет или поделится? Заранее благодарю за ответ.

★★★★★

10.0.0.1 и 10.0.10.100 - это всего лишь человеко-читаемые нотации. Переводи обратно в числа и перебирай, делов то.

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

Хех, если бы всё было бы так просто :) Но мне нужно скармливать 2-3 последних октета :(

IPR ★★★★★
() автор топика

1. Разбить IP0 и IP1 на токены

2. Зафигачить циклы:

for a in $(seq $token00 $token10); do
  for b in $(seq $token01 $token11); do
    for c in $(seq $token02 $token12); do
      for d in $(seq $token03 $token13); do
        echo "IP = $a.$b.$c.$d
done;done;done;done

Eddy_Em ☆☆☆☆☆
()
Ответ на: ракетной науки тред от anonymous

ракетной науки тред
echo 10.0.{0..10}.{1..100}

Именно ;) Ибо

echo 10.0.{0..9}.{1..254} 10.0.10.{1..100}

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

Тогда уж

echo 10.0.0.1 10.0.{1..9}.{0..255} 10.0.10.{1..100} 

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

Написал бы, что за система тогда.

Попробуй что-то типа

seq 1 9 | while read o3; do seq 0 254 | while read o4; do echo 10.0.$o3.$o4; done;done
anonymous
()
Ответ на: комментарий от anonymous

Ну и? Это хардкод для одного диапазона который ТС просто в пример привёл.

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

я ж написал, shell, а не bash

seq в помощь...

for i in $(seq 1 9); do for j in $(seq 0 255); do echo 10.0.$i.$j; done; done; for j in $(seq 0 100); do echo 10.0.10.$j; done
Но зачем?

bormant ★★★★★
()

Какой именно шел нужен? На bash, zsh и ksh будет работать

#! /bin/ksh

function atoi
{
    IP=$1; IPNUM=0
    for (( i=0 ; i<4 ; ++i )); do
        ((IPNUM+=${IP%%.*}*$((256**$((3-${i}))))))
    IP=${IP#*.}
    done
    echo $IPNUM
}.

function itoa
{
    echo -n $(($(($(($((${1}/256))/256))/256))%256)).
    echo -n $(($(($((${1}/256))/256))%256)).
    echo -n $(($((${1}/256))%256)).
    echo $((${1}%256))
}

min=$(atoi 10.0.0.1)
max=$(atoi 10.0.10.100)

for i in `seq $min $max`; do
    echo `itoa $i`
done
у dash другой синтаксис функции и нет возведения в степень. csh не знаю.

at ★★
()

Вспомнил о сей теме. По сабжу: проблема решилась, нашёл такую утилиту http://packetstormsecurity.com/files/23272/ipgenv2.tar.gz.html изготовленную аж в 2000 году. Вдруг кому пригодится.

И да, perl. К моей задаче не совсем подходит, но всё же.

IPR ★★★★★
() автор топика
Последнее исправление: IPR (всего исправлений: 1)
18 апреля 2014 г.
Ответ на: комментарий от at

Предлагаю такой вариантик, генерирует список для маски 16 за 1 минуту

#! /bin/bash
mask=16
ip=93.158.134.3
time (printf "%0.2X\n%0.2X\n%0.2X\n%0.2X\n" $(printf $ip |tr "." " ")|
xargs -I{}  sh -c 'echo "obase=2; ibase=16; {}"|bc -l'|
xargs -I{} printf "%0.8d" {};echo) |
while read addr;
do
	net=$(cut -c-$mask <<<$addr)
	node=$(cut -c$[mask+1]-32 <<<$addr)
	node_start=${node//1/0}
	node_end=${node//0/1}
	counter=$(echo -n $node_start|wc -c)
	echo $counter
	echo -e "$addr
	$net
	$node
	$node_start
	$node_end"
	echo $[ 2#$node_end  ]
	for ((c=$[ 2#$node_start  ];c<$[ 2#$node_end  ];c++ ));do
	echo $c
	done|sed 's/^/obase=2;/g'|bc -l|xargs -l1 printf "$net%0.${counter}d\n"|sed 's/\(........\)/ibase=2;\1\n/g'|bc -l|sed -n 'N;N;N;s/\n/./g;p'|cat -n 
done > ~/temp/ip.list
anonymous
()

А почему-бы тебе не написать это на нормальном языке программирования?
Получить список ip шников, а потом скинуть этот файл в ту систему где нету баша и perl/python/ruby.

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