【问题标题】:Bash script to calculate summarize IP address ranges用于计算汇总 IP 地址范围的 Bash 脚本
【发布时间】:2016-05-07 05:39:25
【问题描述】:

我需要编写一个 bash 脚本,当我输入两个 IP 地址时,它会为它们计算汇总地址。

示例:

192.168.1.27/25
192.168.1.129/25  

结果将是:

192.168.1.0/24  

你能帮我写这个脚本吗?

我知道你会对我说“你尝试了什么?”

我试图在谷歌中找到一些东西,但我发现我必须转换为二进制然后计算它,这将非常困难。

我什至不知道如何开始。

有什么想法或提示吗?

【问题讨论】:

  • 你到底想在这里做什么?找到包含给定 IP 地址的最小网络?
  • 如果我有很多子网,试着总结一下,(最常见的地址)
  • 那是“是的,我的意思是包含所有给定 IP 地址的最小子网”吗?还是“不,我的意思是别的”?
  • 查看视频,展示我需要做什么

标签: bash ip ipv4 netmask


【解决方案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

【讨论】:

  • 那是一些严肃的 bash-fu :)
猜你喜欢
  • 2014-07-09
  • 2018-01-09
  • 2014-02-15
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
相关资源
最近更新 更多