читать IP-адрес и проверять, действительно ли/между диапазоном

Мой текущий скрипт:

#!/usr/local/bin/bash
echo -n "Enter VPS IP address:"
read userinput
lookupip="vps $userinput"

if [[ $userinput -lt 80.* || $userinput -gt 255.* ]] #checks input is in the range
 then
   echo "Input outside acceptable range."
 else

#The grep removes all from VPS tool output except primary IP address

$lookupip | grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' | sed '1 ! d' | xargs ping -oc 1000 -Q

fi

Самый низкий диапазон IP-адресов находится в диапазоне 80.X.X.X, я пробовал использовать:

8 *
80 *
80. . . *

Но это всегда ошибки:

line 10: [[: 80.X.X.X: syntax error in expression (error token is ".X.X.X")

Каким будет лучший способ определить диапазон IP-адресов меньше (lt) и gt (больше)?

0
nl ja de
Не скрывайте команду, которую вы используете в переменной. Это делает код менее читаемым и работает не так часто, как вы думаете. Просто введите vps $ userinput | grep ...
добавлено автор chepner, источник
Хорошо, это имеет смысл, но как я могу тогда называть его аккуратно из цикла if?
добавлено автор Zippyduda, источник

2 ответы

если вы просто хотите проверить, действителен ли IP-адрес, вы можете использовать команду ipcalc в bash, чтобы проверить это.

ipcalc -c $userinput
example
ipcalc -c 10.20.30.401
ipcalc: bad IPv4 address: 10.20.30.401
2
добавлено

Вероятно, это не лучшее решение, но в качестве быстрого исправления для вашего скрипта следует:

#!/usr/local/bin/bash
echo -n "Enter VPS IP address:"
read userinput
lookupip="vps $userinput"
first_octet=`echo "$userinput" | cut -d'.' -f1`

if [[ $first_octet -lt 80 || $first_octet -gt 255 ]]
 then
   echo "Input outside acceptable range."
 else

#The grep removes all from VPS tool output except primary IP address

$lookupip | grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' | sed '1 ! d' | xargs ping -oc 1000 -Q

fi

EDITED: лучшее решение должно было бы взять все три IP-адреса (тот, который находится под контролем, самый низкий и самый высокий) в качестве параметров, преобразовать их в 32-разрядный номер (это то, что inet_aton() функция) и диапазоны проверки:

#!/usr/local/bin/bash

inet_aton ()
{
    local IFS=. ipaddr ip32 i
    ipaddr=($1)
    for i in 3 2 1 0
    do
        (( ip32 += ipaddr[3-i] * (256 ** i) ))
    done

    return $ip32
}

echo -n "Enter VPS IP address, min IP address, max IP address:"
read userinput

ip1=`echo "$userinput" | cut -d' ' -f1`
ip2=`echo "$userinput" | cut -d' ' -f2`
ip3=`echo "$userinput" | cut -d' ' -f3`

lookupip="vps $ip1"

ip=`inet_aton $ip1`
min=`inet_aton $ip2`
max=`inet_aton $ip3`

if [[ $ip -lt $min || $ip -gt $max ]]
 then
   echo "Input outside acceptable range."
 else

#The grep removes all from VPS tool output except primary IP address

$lookupip | grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' | sed '1 ! d' | xargs ping -oc 1000 -Q

fi

Единственное различие заключается в том, что вам нужно ввести 3 IP-адреса, а не один. Конечно, самые низкие и самые высокие IP-адреса могут быть жестко закодированы или взяты из других источников, но я оставляю это, наряду с проверкой параметров и проверкой ошибок, до вас.

1
добавлено
Используйте IFS = "." read -a octets <<< $ userinput . Затем проверяйте каждый из $ {октетов [0]} , $ {октетов [1]} и т. Д. Отдельно.
добавлено автор chepner, источник
@ Zippyduda ответьте на обновление, чтобы быть более гибким.
добавлено автор KBart, источник
Это работает, спасибо :) В идеале он будет просматривать весь IP-адрес и проверить, есть ли он в списке диапазонов, которые у меня есть. Существует 10 уникальных диапазонов, которые варьируются в зависимости от 3-го и 4-го октетов.
добавлено автор Zippyduda, источник
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.