Найти IP-адрес и проверить, в какой подсети он находится - PullRequest
0 голосов
/ 05 января 2019

У нас есть 3 здания, и я хотел бы определить IP-адрес, которым обладает компьютер, а затем определить, в какой подсети он находится, используя серию операторов if / else.

Например:

  • Здание 1 = 192.168.1.1 / 24
  • Здание 2 = 192.168.2.1 / 24
  • Здание 3 = 192.168.3.1 / 24

Я думаю, что я выяснил, как определить IP-адрес компьютера, теперь мне просто нужна помощь, чтобы выяснить, как изменить IP-адрес на число, которое можно оценить. Это то, что у меня пока есть, но мне не хватает как-то конвертировать IP.

#!/bin/bash

ip=192.168.1.20

building1min=192.168.1.1
building1max=192.168.1.255

building2min=192.168.2.1
building2max=192.168.2.255

building3min=192.168.3.1
building3max=192.168.3.255

if [ $ip -lt $building1max && $ip -gt $building1min ]{
    echo "User is in Building 1"
} else if [ $ip -lt $building2max && $ip -gt $building2min ]
    echo "User is in Building 2"
} else if [ $ip -lt $building3max && $ip -gt $building3min ]{
    echo "User is in Building 3"
} else {
    echo "User is not in any building"
}

1 Ответ

0 голосов
/ 05 января 2019

Следующий код должен указать вам правильное направление:

#!/usr/bin/env bash

binary=( {0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1} )

convertToBinary() {
    local -a oct
    local o res ip=$1 mask=$2 

    IFS=. read -ra oct <<< "$ip"
    for o in "${oct[@]}"; do
        res+=${binary[o]}
    done

    printf '%s\n' "${res:0:mask}"
}

isInSubnet() {
    local sub=$1 ip=$2
    local sub_ip=${sub%/*} sub_mask=${sub#*/}

    [[ $(convertToBinary "$sub_ip" "$sub_mask") = "$(convertToBinary "$ip" "$sub_mask")" ]]
}

# USAGE

ip=192.168.2.15
b1=192.168.1.0/24 b2=192.168.2.0/24

if isInSubnet "$b1" "$ip"; then
    echo building 1
elif isInSubnet "$b2" "$ip"; then
    echo building 2
fi

Сначала он преобразует IP-адреса в двоичные и извлекает только те сетевые адреса, которые затем проверяются на равенство.

...