LinuxForum.Fans
Тема

Сравнение файлов

Автор: AlfaStriker 13 сообщений 3845 просмотров
#356040

Есть два файла.

Файл №1 - содержит маску и IP адрес, вида:

text
subnet 10.0.0.2 netmask 255.255.255.0 {
subnet 192.168.10.2 netmask 255.255.255.0 {
subnet 172.16.10.2 netmask 255.255.255.0 {

Здесь важна маска, так как она определяет количество IP адресов в подсети (IP pool).
Файл №2 - содержит IP адреса:

text
lease 10.0.0.10 {
lease 10.0.0.11 {
lease 10.0.0.12 {
lease 192.168.10.10 {
lease 192.168.10.11 {
lease 192.168.10.12 {
lease 172.16.10.10  {
lease 172.16.10.11 {
lease 172.16.10.12 {

Требуется:
1. Открыть файл №1 - в нем узнать какие есть подсети (пулы) с маской, по маске определить какое количество IP адресов в ней может быть.
2. Открыть файл №2 - подсчитать количество IP адресов в каждой подсети - занятые IP адреса.
3. Итог: узнать количество занятых IP адресов в подсети, а также IP адреса которые не заняты.

Честно сказать задача очень интересна, но пока мои познания в баше очень-очень скромны.

#356087

Файл dhcpd.leases (он же файл № 2) вполне может содержать "просроченные" записи. Вы их как-либо отсеиваете?

#356089

Это конечно надо, но пока хорошо было бы подсчитать кол-во занятых ИП в подсетях.
Сейчас изучаю Bash, но думаю не успею к сроку.

#356148

Здесь баша мало. Надо понимать сети. А еще ping + arp решит задачу.

#356150

мак адрес получим.
а если хост недоступен (ping) ?

#356227

Вот вам "быстренький и грязненький" скрипт. :)

text

#!/bin/bash

subnet_file="$1" leases_file="$2"

# Простейшая проверка на правильность запуска скрипта if [ $# -ne 2 ]; then echo "Usage: `basename $0` <subnets_file> <leases_file>" exit 255 fi

# Начинаем считывать данные из файла с подсетями while read _pool; do # Далее получаем нужные данные subnet=$(echo "${_pool}" | awk '{print $2"/"$4}') # приводим к "правильному" виду подсеть declare -i ip_total=$(ipcalc ${subnet} | grep -i "hosts/net" | awk '{print $2}') # количество адресов в подсети declare -i ip_first=$(ipcalc ${subnet} | grep -i "hostmin" | awk '{print $3$4}' | sed 's/\.//g') # начальный адрес в двоичной форме declare -i ip_last=$(ipcalc ${subnet} | grep -i "hostmax" | awk '{print $3$4}' | sed 's/\.//g') # конечный адрес в двоичной форме declare -i ip_leased=0 # задаем начальное значение счетчику выданных адресов # Начинаем считывать данные из файла с выданными адресами while read _lease; do # Приводим адрес к двоичному виду, чтобы сравнить его с начальным и конечным declare -i ip_addr=$(echo "${_lease}" | awk '{print $2}' | xargs ipcalc | grep -i "address" | awk '{print $3$4}' | sed 's/\.//g') # Собственно сравнение. Если адрес входит в диапазон адресов подсети, увеличиваем счетчик на единицу if [ ${ip_addr} -ge ${ip_first} -a ${ip_addr} -le ${ip_last} ]; then ip_leased=${ip_leased}+1 fi

done < "${leases_file}"

# Вычисляем количество свободных адресов ip_free=$((${ip_total}-${ip_leased})) # Выдаем полученную информацию на экран echo "Subnet ${subnet}: total ${ip_total}, leased ${ip_leased}, free ${ip_free}"

done < "${subnet_file}"

А вот как он отработал на ваших файлах:

text

$ ./free_ips.sh file1.txt file2.txt 
Subnet 10.0.0.2/255.255.255.0: total 254, leased 3, free 251
Subnet 192.168.10.2/255.255.255.0: total 254, leased 3, free 251
Subnet 172.16.10.2/255.255.255.0: total 254, leased 3, free 251

По поводу "грязности" скрипта: во-первых, для своей работы он требует grep, awk и sed, а главное - пакет ipcalc, а во-вторых, утилита ipcalc из пакета initscripts в CentOS не подойдет. Но это в целом не беда, скрипт можно будет доделать так, чтобы он смог работать с обоими вариантами ipcalc, а также и с sipcalc. Пока же попробуйте его у себя и сообщите об ошибках, буде таковые возникнут.

#356244

Большое спасибо, будем тестировать и вникать)))

#356293

чем вам хеши не угодили?

#356297

А их нам разве кто-то предлагал? :)

#356301

так давайте предложим сами)

#356303

Не имею ни малейших возражений. Предлагайте, коллега. :)

#356308

я правил не знаю как там в айпи.
от сети нужно минусовать два?

да и сисадмин с меня непутевый.
мне вот прямые задачки бы решать. где ПОЛНОСТЬЮ ДАНЫ УСЛОВИЯ

#356314

Не-не-не, ничего минусовать не надо. Тут у вопрошающего немного необычно адреса подсетей заданы - правильнее было бы не 10.0.0.2, а 10.0.0.0 и так далее. А вообще задача не особо трудная и творческая - просто определить принадлежность конкретного IP-адреса той или иной подсети. В Perl'е для этой задачи применяется модуль Net::IP::RangeCompare. Ну, а в shell-скриптах я как-то больше привык ipcalc использовать.

Войдите или зарегистрируйтесь, чтобы ответить.