bash: проверка синтаксиса ip (как проверить корректность ввода IP-адреса пользователем)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Atheist
Сообщения: 63

bash: проверка синтаксиса ip

Сообщение Atheist »

есть скрипт на баше, который ждет ввода юзера.
Пользователь вводит ИП-адрес, надо проверить правильно ли он его ввел.
вроде пока все получается, но затычка на этапе проверки количества "точек".

Тоесть если ввели 192.168.0.1 и 192168.0.1 - как бы прикрутить вот таку проверку?
А может у кого готовый кусок кода проверки синтаксиса ip есть?
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: bash: проверка синтаксиса ip

Сообщение allez »

Гм, а за чем, собственно, дело стало? Получаем строку, содержащую IP-адрес, а затем проверяем ее на соответствие следующим условиям:

1. Адрес может состоять только из цифр и точек.
2. Адрес должен состоять из 4 октетов (чисел, разделенных точками).
3. 1-й и 4-й октеты адреса могут принимать значения от 1 до 254 включительно, 2-й и 3-й - от 0 до 254 включительно.

Вот, собственно, и все. Удовлетворяет введенная строка всем трем условиям - значит, может претендовать на гордое звание IP-адреса, удовлетворяет только первым двум - возможно, это не адрес, а маска сети. Не удовлетворяет любому из первых двух - посылается вместе с пользователем по совсем другому адресу. :)
Спасибо сказали:
Atheist
Сообщения: 63

Re: bash: проверка синтаксиса ip

Сообщение Atheist »

allez писал(а):
19.06.2007 13:43
2. Адрес должен состоять из 4 октетов (чисел, разделенных точками).


Вот со вторым пунктом и проблема. Не могу понять как это в баше реализовать, через awk вроде можно, но как?
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: bash: проверка синтаксиса ip

Сообщение allez »

Например, так:

Код: Выделить всё

$ IP="192.168.0.1"; NUM=`echo $IP | awk -F "." '{print NF}'`; echo $NUM
4

$ IP="192168.0.1"; NUM=`echo $IP | awk -F "." '{print NF}'`; echo $NUM
3
Спасибо сказали:
Atheist
Сообщения: 63

Re: bash: проверка синтаксиса ip

Сообщение Atheist »

allez - спасибо, то что надо!
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: bash: проверка синтаксиса ip

Сообщение allez »

Вот вам вдогонку:

Код: Выделить всё

$ IP="192.168.7.1"; echo $IP | awk -F "." '{if ( NF != 4 ) print "It is not an IP-address"; else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "It is a right IP-address"; else print "It is not a valid IP-address"}'
It is a right IP-address

$ IP="192168.7.1"; echo $IP | awk -F "." '{if ( NF != 4 ) print "It is not an IP-address"; else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "It is a right IP-address"; else print "It is not a valid IP-address"}'
It is not an IP-address

$IP="292.168.7.1"; echo $IP | awk -F "." '{if ( NF != 4 ) print "It is not an IP-address"; else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "It is a right IP-address"; else print "It is not a valid IP-address"}'
It is not a valid IP-address
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: bash: проверка синтаксиса ip

Сообщение sash-kan »

allez писал(а):
19.06.2007 14:16
$1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255
вообще-то, можно и побольше равентсв:

Код: Выделить всё

$1 >= 0 && $1 <= 255 && $2 >=0 && $2 <= 255 && $3 >=0 && $3 <= 255 && $4 >= 0 && $4 <= 255
ведь и 0.0.0.0 и 255.255.255.255 и 10.255.255.10 и т.д. и т.п. — в принципе, вполне допустимые ip-адреса. но тут уж зависит от задачи, которой служит сама проверка.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Atheist
Сообщения: 63

Re: bash: проверка синтаксиса ip

Сообщение Atheist »

а если я строку

Код: Выделить всё

echo $IP | awk -F "." '{if ( NF != 4 ) print "It is not an IP-address";
else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "It is a right IP-address";
else print "It is not a valid IP-address"}'


запихну в функцию, вот так:

Код: Выделить всё

#!/bin/bash

test_ip () {
echo $1 | awk -F "." '{if ( NF != 4 ) print "It is not an IP-address";
else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "It is a right IP-address";
else print "It is not a valid IP-address"}'
}

test_ip 192.168.500.500
echo $?


Такой скрипт вернет мне:
It is not a valid IP-address
0


А как сделать чтобы функция возвращала не 0, а к примеру 1 при неверном адресе. как я понимаю нужно "print" заменить на exit 1 и все? будет работать?
Спасибо сказали:
Аватара пользователя
indie
Сообщения: 87

Re: bash: проверка синтаксиса ip

Сообщение indie »

Atheist писал(а):
19.06.2007 14:44
а если я строку

Код: Выделить всё

echo $IP | awk -F "." '{if ( NF != 4 ) print "It is not an IP-address";
else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "It is a right IP-address";
else print "It is not a valid IP-address"}'


запихну в функцию, вот так:

Код: Выделить всё

#!/bin/bash

test_ip () {
echo $1 | awk -F "." '{if ( NF != 4 ) print "It is not an IP-address";
else if ( $1 > 0 && $1 < 255 && $2 >=0 && $2 < 255 && $3 >=0 && $3 < 255 && $4 > 0 && $4 < 255 ) print "It is a right IP-address";
else print "It is not a valid IP-address"}'
}

test_ip 192.168.500.500
echo $?


Такой скрипт вернет мне:
It is not a valid IP-address
0


А как сделать чтобы функция возвращала не 0, а к примеру 1 при неверном адресе. как я понимаю нужно "print" заменить на exit 1 и все? будет работать?

print ... на return 1 замени
Спасибо сказали:
Atheist
Сообщения: 63

Re: bash: проверка синтаксиса ip

Сообщение Atheist »

Да, точно, return работает.
А вот еще вопрос тогда:
что поправить в коде ниже, чтобы была проверка на цифры? (в мануале к awk прочитал про [:digit:], но как его применить то)?

Код: Выделить всё

COD="12q"
echo $COD | awk '{if ( length == 3 && $1 >= 0 && $1 <= 999 ) print "Only Digit";
else print "Not Only Digit"}'
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: bash: проверка синтаксиса ip

Сообщение sash-kan »

Atheist писал(а):
19.06.2007 15:05
А вот еще вопрос тогда:
что поправить в коде ниже, чтобы была проверка на цифры? (в мануале к awk прочитал про [:digit:], но как его применить то)?

Код: Выделить всё

COD="12q"
echo $COD | awk '{if ( length == 3 && $1 >= 0 && $1 <= 999 ) print "Only Digit";
else print "Not Only Digit"}'
с участием sed:

Код: Выделить всё

echo $COD | if [[ "$(sed 's/[0-9]\{3\}//')" == "" ]]; then echo "Only Digit"; else echo "Not Only Digit"; fi

или, если хочется [[:digit:]]

Код: Выделить всё

echo $COD | if [[ "$(sed 's/[[:digit:]]\{3\}//')" == "" ]]; then echo "Only Digit"; else echo "Not Only Digit"; fi
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Atheist
Сообщения: 63

Re: bash: проверка синтаксиса ip

Сообщение Atheist »

черт возьми как все можно круто завернуть.. У меня блин код этот просто огромный :)

Код: Выделить всё

testcode ()
# функция проверки корректности ввода пользователя (должы быть введены только цифры)
# 1 аргумент - введенная пользователем строка
# 2 аргумент - ожидаемая длинна строки
{
case $1 in
    *[!0-9]*|"") return 1;; #арумент содержит по меньшей мере один не цифровой символ.
              *) #аргумент содержит только цифры [0 - 9]
                 if [ $(echo $1 | awk '{print length}') == "$2" ]; then #проверка на кол-во символов
                 return 0 #аргумент содержит нужное количество цифр
                 else
                 return 2 #аргумент из цифр, но длиннее или короче чем надо
                 fi;;
esac
}
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: bash: проверка синтаксиса ip

Сообщение sash-kan »

[offtop]
Atheist писал(а):
19.06.2007 15:42
черт возьми как все можно круто завернуть.
эге ж. в юниксах все просто. в отличие от доса.
вот только что решал задачу для доса — надо очищать содержимое каталога из скрипта. в юниксе-то все просто:

Код: Выделить всё

rm -rf /path/*
а под досом пришлось сочинять вот такую громоздкую конструкцию:

Код: Выделить всё

del /F /S /Q C:\path\*
for /D %%i in (C:\path\*) do rmdir /S /Q "%%i"
это уж не говоря про то, что если какой-нибудь из файлов под тем или иным соусом будет использоваться хотя бы одним процессом, то удаление просто потерпит фиаско... как же под досом все сложно... © возможно мой
[offtop]
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
tombird
Сообщения: 3
ОС: Slackware

Re: bash: проверка синтаксиса ip

Сообщение tombird »

Код: Выделить всё

[[ $1 =~ ^\([0-9]+\\.\){3}[0-9]+$ ]] && echo IP

bash 3.0+
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: bash: проверка синтаксиса ip

Сообщение diesel »

tombird писал(а):
22.06.2007 23:41

Код: Выделить всё

[[ $1 =~ ^\([0-9]+\\.\){3}[0-9]+$ ]] && echo IP

bash 3.0+


Код: Выделить всё

[[ $i =~ ^\([0-9]{1,3}\\.\){3}[0-9]{1,3}$ ]] && echo IP


вот так вроде точнее :)
Спасибо сказали:
dSLON
Сообщения: 1
ОС: Linux

Re: bash: проверка синтаксиса ip

Сообщение dSLON »

Немного индуизма:

Код: Выделить всё

IPNM="111.111.111/26"
[ $(ipcalc ${IPNM}| head -1 | awk '{print $1}') == "INVALID" ] && echo "There's something WRONG witn given IP/netmask!"
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: bash: проверка синтаксиса ip

Сообщение allez »

Во-первых, некрофилия. :)
Во-вторых, в каждой ли системе обязательно присутствует ipcalc?
В-третьих, вместо связки "head | awk" достаточно одного grep.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: bash: проверка синтаксиса ip

Сообщение drBatty »

вот мой фильтр:

Код: Выделить всё

sed -rn 's/^([0-2]?[0-9]{1,2}\.){3}[0-2]?[0-9]{1,2}$/&/p'

недостаток: пропускает IP вида 299.299.299.299
но мне хватает.


А вот способ на BASH (преобразование в массив)

Shell

doc@bx:~$ IFS="$IFS." doc@bx:~$ IP=(11.22.33.44) doc@bx:~$ IP=($IP) doc@bx:~$ echo ${IP[0]} 11 doc@bx:~$ echo ${IP[1]} 22 doc@bx:~$ echo ${IP[2]} 33 doc@bx:~$ echo ${IP[3]} 44

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: bash: проверка синтаксиса ip

Сообщение t.t »

drBatty писал(а):
31.08.2010 00:51
sed -rn 's/…/&/p'
А почему не '/…/p'?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: