bash: проверка синтаксиса ip (как проверить корректность ввода IP-адреса пользователем)
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 63
bash: проверка синтаксиса ip
есть скрипт на баше, который ждет ввода юзера.
Пользователь вводит ИП-адрес, надо проверить правильно ли он его ввел.
вроде пока все получается, но затычка на этапе проверки количества "точек".
Тоесть если ввели 192.168.0.1 и 192168.0.1 - как бы прикрутить вот таку проверку?
А может у кого готовый кусок кода проверки синтаксиса ip есть?
Пользователь вводит ИП-адрес, надо проверить правильно ли он его ввел.
вроде пока все получается, но затычка на этапе проверки количества "точек".
Тоесть если ввели 192.168.0.1 и 192168.0.1 - как бы прикрутить вот таку проверку?
А может у кого готовый кусок кода проверки синтаксиса ip есть?
-
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: bash: проверка синтаксиса ip
Гм, а за чем, собственно, дело стало? Получаем строку, содержащую IP-адрес, а затем проверяем ее на соответствие следующим условиям:
1. Адрес может состоять только из цифр и точек.
2. Адрес должен состоять из 4 октетов (чисел, разделенных точками).
3. 1-й и 4-й октеты адреса могут принимать значения от 1 до 254 включительно, 2-й и 3-й - от 0 до 254 включительно.
Вот, собственно, и все. Удовлетворяет введенная строка всем трем условиям - значит, может претендовать на гордое звание IP-адреса, удовлетворяет только первым двум - возможно, это не адрес, а маска сети. Не удовлетворяет любому из первых двух - посылается вместе с пользователем по совсем другому адресу.
1. Адрес может состоять только из цифр и точек.
2. Адрес должен состоять из 4 октетов (чисел, разделенных точками).
3. 1-й и 4-й октеты адреса могут принимать значения от 1 до 254 включительно, 2-й и 3-й - от 0 до 254 включительно.
Вот, собственно, и все. Удовлетворяет введенная строка всем трем условиям - значит, может претендовать на гордое звание IP-адреса, удовлетворяет только первым двум - возможно, это не адрес, а маска сети. Не удовлетворяет любому из первых двух - посылается вместе с пользователем по совсем другому адресу.

-
- Сообщения: 63
-
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: bash: проверка синтаксиса ip
Например, так:
Код: Выделить всё
$ 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
-
- Сообщения: 63
Re: bash: проверка синтаксиса ip
allez - спасибо, то что надо!
-
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: bash: проверка синтаксиса ip
Вот вам вдогонку:
Код: Выделить всё
$ 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
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: bash: проверка синтаксиса ip
вообще-то, можно и побольше равентсв:
Код: Выделить всё
$1 >= 0 && $1 <= 255 && $2 >=0 && $2 <= 255 && $3 >=0 && $3 <= 255 && $4 >= 0 && $4 <= 255
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 63
Re: bash: проверка синтаксиса ip
а если я строку
запихну в функцию, вот так:
Такой скрипт вернет мне:
It is not a valid IP-address
0
А как сделать чтобы функция возвращала не 0, а к примеру 1 при неверном адресе. как я понимаю нужно "print" заменить на exit 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"}'
запихну в функцию, вот так:
Код: Выделить всё
#!/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 и все? будет работать?
-
- Сообщения: 87
Re: bash: проверка синтаксиса ip
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 замени
-
- Сообщения: 63
Re: bash: проверка синтаксиса ip
Да, точно, return работает.
А вот еще вопрос тогда:
что поправить в коде ниже, чтобы была проверка на цифры? (в мануале к awk прочитал про [:digit:], но как его применить то)?
А вот еще вопрос тогда:
что поправить в коде ниже, чтобы была проверка на цифры? (в мануале к awk прочитал про [:digit:], но как его применить то)?
Код: Выделить всё
COD="12q"
echo $COD | awk '{if ( length == 3 && $1 >= 0 && $1 <= 999 ) print "Only Digit";
else print "Not Only Digit"}'
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: bash: проверка синтаксиса ip
с участием sed: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"}'
Код: Выделить всё
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
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 63
Re: bash: проверка синтаксиса ip
черт возьми как все можно круто завернуть.. У меня блин код этот просто огромный 

Код: Выделить всё
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
}
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: bash: проверка синтаксиса ip
[offtop]
вот только что решал задачу для доса — надо очищать содержимое каталога из скрипта. в юниксе-то все просто:а под досом пришлось сочинять вот такую громоздкую конструкцию:это уж не говоря про то, что если какой-нибудь из файлов под тем или иным соусом будет использоваться хотя бы одним процессом, то удаление просто потерпит фиаско... как же под досом все сложно... © возможно мой
[offtop]
эге ж. в юниксах все просто. в отличие от доса.
вот только что решал задачу для доса — надо очищать содержимое каталога из скрипта. в юниксе-то все просто:
Код: Выделить всё
rm -rf /path/*
Код: Выделить всё
del /F /S /Q C:\path\*
for /D %%i in (C:\path\*) do rmdir /S /Q "%%i"
[offtop]
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 3
- ОС: Slackware
Re: bash: проверка синтаксиса ip
Код: Выделить всё
[[ $1 =~ ^\([0-9]+\\.\){3}[0-9]+$ ]] && echo IP
bash 3.0+
-
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: bash: проверка синтаксиса ip
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
вот так вроде точнее

-
- Сообщения: 1
- ОС: Linux
Re: bash: проверка синтаксиса ip
Немного индуизма:
Код: Выделить всё
IPNM="111.111.111/26"
[ $(ipcalc ${IPNM}| head -1 | awk '{print $1}') == "INVALID" ] && echo "There's something WRONG witn given IP/netmask!"
-
- Сообщения: 2223
- Статус: Не очень злой админ :-)
- ОС: SuSE, CentOS, FreeBSD, Windows
Re: bash: проверка синтаксиса ip
Во-первых, некрофилия. :)
Во-вторых, в каждой ли системе обязательно присутствует ipcalc?
В-третьих, вместо связки "head | awk" достаточно одного grep.
Во-вторых, в каждой ли системе обязательно присутствует ipcalc?
В-третьих, вместо связки "head | awk" достаточно одного grep.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: bash: проверка синтаксиса ip
вот мой фильтр:
недостаток: пропускает IP вида 299.299.299.299
но мне хватает.
А вот способ на BASH (преобразование в массив)
Код: Выделить всё
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
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: bash: проверка синтаксиса ip
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж