给定IP和网络掩码,如何使用bash计算网络地址?

Chr*_*ian 16 ip bash netmask subnet

在bash脚本中,我有一个类似于192.168.1.15的IP地址和一个像255.255.0.0这样的网络掩码.我现在想要计算这个网络的起始地址,这意味着在两个地址上使用&-operator.在该示例中,结果将是192.168.0.0.有人准备好这样的东西吗?我正在寻找一种优雅的方式来处理来自bash的ip地址

kam*_*uel 40

使用bitwise &(AND)运算符:

$ IFS=. read -r i1 i2 i3 i4 <<< "192.168.1.15"
$ IFS=. read -r m1 m2 m3 m4 <<< "255.255.0.0"
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
192.168.0.0
Run Code Online (Sandbox Code Playgroud)

使用另一个IP和掩码的示例:

$ IFS=. read -r i1 i2 i3 i4 <<< "10.0.14.97"
$ IFS=. read -r m1 m2 m3 m4 <<< "255.255.255.248"
$ printf "%d.%d.%d.%d\n" "$((i1 & m1))" "$((i2 & m2))" "$((i3 & m3))" "$((i4 & m4))"
10.0.14.96
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!正是我要找的,漂亮! (2认同)

cev*_*ing 13

一些Bash函数总结了所有其他答案.

ip2int()
{
    local a b c d
    { IFS=. read a b c d; } <<< $1
    echo $(((((((a << 8) | b) << 8) | c) << 8) | d))
}

int2ip()
{
    local ui32=$1; shift
    local ip n
    for n in 1 2 3 4; do
        ip=$((ui32 & 0xff))${ip:+.}$ip
        ui32=$((ui32 >> 8))
    done
    echo $ip
}

netmask()
# Example: netmask 24 => 255.255.255.0
{
    local mask=$((0xffffffff << (32 - $1))); shift
    int2ip $mask
}


broadcast()
# Example: broadcast 192.0.2.0 24 => 192.0.2.255
{
    local addr=$(ip2int $1); shift
    local mask=$((0xffffffff << (32 -$1))); shift
    int2ip $((addr | ~mask))
}

network()
# Example: network 192.0.2.0 24 => 192.0.2.0
{
    local addr=$(ip2int $1); shift
    local mask=$((0xffffffff << (32 -$1))); shift
    int2ip $((addr & mask))
}
Run Code Online (Sandbox Code Playgroud)

  • 不错,但一个示例线将节省我15分钟搞清楚你的​​参数预期.."网络192.168.8.1 31"或"网络掩码16" (5认同)

小智 5

如果您只有可用的网络前缀(没有网络掩码),只需添加一个替代方法:

IP=10.20.30.240
PREFIX=26
IFS=. read -r i1 i2 i3 i4 <<< $IP
IFS=. read -r xx m1 m2 m3 m4 <<< $(for a in $(seq 1 32); do if [ $(((a - 1) % 8)) -eq 0 ]; then echo -n .; fi; if [ $a -le $PREFIX ]; then echo -n 1; else echo -n 0; fi; done)
printf "%d.%d.%d.%d\n" "$((i1 & (2#$m1)))" "$((i2 & (2#$m2)))" "$((i3 & (2#$m3)))" "$((i4 & (2#$m4)))"
Run Code Online (Sandbox Code Playgroud)