Bash скрипт для подсчета итогового ip-адреса
Мне нужно написать bash-скрипт, который, когда я введу два IP-адреса, будет вычислять суммарный адрес для них.
из базы подписки:
192.168.1.27/25
192.168.1.129/25
Результат будет:
192.168.1.0/24
Можете ли вы помочь мне с этим сценарием?
Я знаю, ты скажешь мне, что ты попробовал.
Я пытался найти что-то в Google, но я обнаружил, что мне нужно преобразовать в двоичный файл, а затем рассчитать, и это будет очень сложно.
Я даже не знаю с чего начать:)
Любая идея или подсказка, пожалуйста?
Спасибо,
Аля
1 ответ
Решение
Расчет общей маски с помощью bash:
#!/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 # e.g. 192.168.1.27
b1="${D2B[$a1]}${D2B[$a2]}${D2B[$a3]}${D2B[$a4]}"
IFS=./ read -r -p "IP 2: " a1 a2 a3 a4 # e.g. 192.168.1.129
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