LINUX.ORG.RU
решено ФорумAdmin

Помогите пожалуйста.


0

1

Ещё такой вопрос появился. Вот скрипт:

#!/bin/bash
vm_id="$1"
ipone="$2"

/usr/sbin/vzctl set ${vm_id} --ipadd ${ipone} --save
Например в переменную ipone нужно занести аргумент который должен содержать три_цифры.три_цифры.три_цифры.три_цифры, то есть обычный IP-адрес, задача такова - если аргумент будет иметь какую нибудь букву или лишнюю цифру - то скрипт должен заматерится. Не подскажешь как это сделать?


➜  ~  cat test.sh
#!/usr/bin/env bash

if [[ "$1" =~ ^(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]){1}$ ]]
then
        echo "correct"
else
        echo "incorrect"
fi

➜  ~  sh test.sh 1.2.3.4
correct
➜  ~  sh test.sh 192.168.1.1
correct
➜  ~  sh test.sh 192.168.1a.3
incorrect
➜  ~  sh test.sh 999.999.99.99 
incorrect
post-factum ★★★★★
()
#!/bin/bash
read a
if [ $a -eq 22 ];
                then echo blablabla
fi
echo "$a"

дальше сам

dada ★★★★★
()
CHK_IP(){
    # usage:
    # CHK_IP ip 
    #
    IFS="." IPTEST=($1)
    unset IFS
    [[ "${IPTEST[0]}.${IPTEST[1]}.${IPTEST[2]}.${IPTEST[3]}" = "$IP" ]] || { echo "usage: CHK_IP ip"; exit 1; }
    for i in {0..3} ; do
        [[ "${IPTEST[$i]}" -gt 2 && "${IPTEST[$i]}" -lt 254 ]] || { echo "$1 is not ip address"; exit 1; }
    done
}   
sin_a ★★★★★
()
Последнее исправление: sin_a (всего исправлений: 1)
Ответ на: комментарий от post-factum

Кажно число из четырёх раздельно проверяю не больше ли оно 254. А, да, надо было на -gt 1 поправить.

sin_a ★★★★★
()
Ответ на: комментарий от post-factum

Ну поправить от 0 до 255. Можно вообще четыре разные проверки сделать, заодно проверить публичный или приватный адрес. У меня было — я привёл.

sin_a ★★★★★
()
Ответ на: комментарий от post-factum

Вообще, 0 и 255 смогут принимать только второй и третий октеты. Если ему нужно адрес что бы его назначить, то ни адрес сети ни бродкаст не подойдут.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

Вообще, 0 и 255 смогут принимать только второй и третий октеты.

Святой Патрик…

Во-первых, 0.0.0.0 — тоже валидный IP-адрес.

Во-вторых, если есть сеть 10.0.0.0/23, то 10.0.1.0 в неё входит и является валидным адресом хоста. Равно как и 10.0.0.255.

post-factum ★★★★★
()
Последнее исправление: post-factum (всего исправлений: 1)
Ответ на: комментарий от post-factum

Ну у меня для частного случая, и у него, подозреваю, такой же. Но изменить диапазон как бы недолго.

sin_a ★★★★★
()
Ответ на: комментарий от post-factum

Ну как отговорки. Если у меня например сеть /24, то для меня нужна именно такая проверка. И совсем наоборот, попадание 0 и 255 в последнем октете для меня будет ошибкой.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

Другой вопрос, зачем OpenVZ-контейнеру сеть /24. Ладно, это уже вне изначальной темы, варианты предложены, пусть выбирает.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

Вообще, по хорошему, для проверки каждого октета свой диапазон лучше задавать. Хотя если сеть больше /24 то диапазон может зависеть от предыдущего октета :) . Хотя есть метод, перевести ip адрес в число, и числа уже сравнивать. Так пожалуй было бы правильней всего.

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

sin_a ★★★★★
()
echo 0.0.0.0 | grep -P '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$' || { echo FAIL; exit; };

-P включить перловые регекспы
\d одна цифра
\d{1,3} от одной до 3 цифр
\. просто точка
^ начало строки
$ конец строки

Bers666 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.