判断两个IP是否在同一网段(SHELL实现)

实现代码

#!/bin/bash

# 函数:提取 CIDR 的网络地址和子网掩码
function extract_network() {
    echo $1 | awk -F '/' '{print $1}'
}

function extract_subnet() {
    echo $1 | awk -F '/' '{print $2}'
}

# 函数:将 IP 地址转换为二进制格式
function ip_to_binary() {
    local ip=$1
    local binary=""
    local IFS='.'
    local octets=($ip)
    for octet in "${octets[@]}"; do
        local bin_octet=""
        local num=$octet
        for (( i=0; i<8; i++ )); do
            bin_octet=$((num % 2))$bin_octet
            num=$((num / 2))
        done
        binary+=$bin_octet
    done
    echo $binary
}

# 函数:比较两个 IP 地址是否在同一网段
function same_network() {
    network1=$(extract_network $1)
    subnet1=$(extract_subnet $1)
    network2=$(extract_network $2)
    subnet2=$(extract_subnet $2)

    binary1=$(ip_to_binary $network1)
    binary2=$(ip_to_binary $network2)

    # 截取相同长度的二进制子串
    binary1=$(echo $binary1 | cut -c1-$subnet1)
    binary2=$(echo $binary2 | cut -c1-$subnet2)

    if [ "$binary1" == "$binary2" ]; then
        echo "两个 CIDR 在同一网段"
    else
        echo "两个 CIDR 不在同一网段"
    fi
}

# 测试
CIDR1="10.206.216.21/24"
CIDR2="10.206.217.10/24"
same_network $CIDR1 $CIDR2
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pcj_888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值