2016-01-29 20 views
0

Мне нужно написать сценарий bash, который, когда я ввожу два IP-адреса, будет вычислять адрес для них.Сценарий Bash для расчета суммированного ip-адреса

базы подписки:

192.168.1.27/25 
192.168.1.129/25 

Результат будет:

192.168.1.0/24 

Можете ли вы помочь мне с этим сценарием?

Я знаю, что вы скажете мне, что вы пробовали.

Я попытался найти что-то в Google, но я обнаружил, что должен преобразовать в двоичный код, а затем вычислить его, и это будет очень сложно.

Я даже не знаю, как начать с ним :)

Любая идея или намекают, пожалуйста?

Спасибо,
Аля

+3

Что вы пытаетесь сделать здесь именно? Найдите наименьшую сеть, которая включает в себя IP-адреса? –

+0

Если у меня много подсети, попробуйте суммировать их (наиболее распространенный адрес) – Miron

+1

https://www.youtube.com/watch?v=8TFV2VycauM – Miron

ответ

6

Расчет общей сетевой маски с Баш:

#!/bin/bash 

D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}) 
declare -i c=0        # set integer attribute 

# read and convert IPs to binary 
IFS=./ read -r -p "IP 1: " a1 a2 a3 a4 m # e.g. 192.168.1.27/25 
b1="${D2B[$a1]}${D2B[$a2]}${D2B[$a3]}${D2B[$a4]}" 

IFS=./ read -r -p "IP 2: " a1 a2 a3 a4 m # e.g. 192.168.1.129/25 
b2="${D2B[$a1]}${D2B[$a2]}${D2B[$a3]}${D2B[$a4]}" 

# find number of same bits ($c) in both IPs from left, use $c as counter 
for ((i=0;i<32;i++)); do 
    [[ ${b1:$i:1} == ${b2:$i:1} ]] && c=c+1 || break 
done  

# create string with zeros 
for ((i=$c;i<32;i++)); do 
    fill="${fill}0" 
done  

# append string with zeros to string with identical bits to fill 32 bit again 
new="${b1:0:$c}${fill}" 

# convert binary $new to decimal IP with netmask 
new="$((2#${new:0:8})).$((2#${new:8:8})).$((2#${new:16:8})).$((2#${new:24:8}))/$c" 
echo "$new" 

Выход:

 
192.168.1.0/24 
+1

это какой-то серьезный баш-фу :) –

 Смежные вопросы

  • Нет связанных вопросов^_^