Регулярное выражение в Bash для проверки IP-адреса

В зависимости от Вашего дистрибутива можно добавить сценарии для выполнения автоматически на начальной загрузке. Если бы Вы используете initscripts, они были бы добавлены к rc.local (/etc/rc.local IIRC), и с systemd я полагаю, что Вы сделали бы сервисный файл для них и затем включили бы его так, он работал на начальной загрузке.

С debian это был бы initscripts и таким образом rc.local.

Монтирование должно быть, покончили /etc/fstab который будет работать на начальной загрузке.

4
31.01.2014, 13:20
4 ответа

python regexp использует синтаксис расширенного регулярного выражения, который прибывает из egrep команда в 70-х (хотя {...} часть была добавлена позже, и на самом деле в grep прежде egrep).

POSIX консолидировал grep и egrep команды (egrep теперь grep -E) в 90-х и стандартизированный {x,y} оператор (который не был доступен в ранее egreps).

Таким образом, теперь необходимо смочь использовать grep -E 'that-regexp' со всеми современными grep реализации.

Обратите внимание, что Ваш regexp позволил бы 299.299.299.299 и {1}s избыточны. {0,1} может быть сокращен к ?.

Отметьте это grep найдите строки, которые соответствуют regexp, который является строками, которые содержат строку, которые соответствуют regexp где угодно. Использовать ^ и $ к привязке или использованию -x опция к grep.

4
27.01.2020, 20:47

Попробованный для сокращения regexp вот результат:

#!/bin/bash

rx='([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'

for ip in 08.08.08.08 3.3.3.3 11.11.11.11 \
      111.123.11.99 \
      222.2.3.4 999.88.9.9 \
      255.255.255.255 255.0.3.3 0.256.0.222; do

   if [[ $ip =~ ^$rx\.$rx\.$rx\.$rx$ ]]; then
      echo "valid:     "$ip
   else
      echo "not valid: "$ip
   fi
done
6
27.01.2020, 20:47
  • 1
    Обратите внимание, что это говорит 08.08.08.08 допустимо. –  Stéphane Chazelas 31.01.2014, 14:58
  • 2
    Вы подразумеваете, что начальные нули не позволяются? –   31.01.2014, 15:01
  • 3
    я подразумеваю, что начальный нуль обычно означает восьмеричный в IP-адресе, и 08 не допустимое восьмеричное. В Firefox, например, если Вы входите http://010.010.010.010, Вы запрашиваете 8.8.8.8, и если Вы запрашиваете http://08.08.08.08, Firefox пытается разрешить его как имя хоста, поскольку это не допустимый IP-адрес. –  Stéphane Chazelas 31.01.2014, 15:03
  • 4
    Это плохо мне знакомо, Вы могли проверить снова? –   31.01.2014, 15:15
  • 5
    Взгляды хорошо теперь. Дополнительные материалы для чтения в страницах справочника inet_addr (очень широко распространенный синтаксис BSD/POSIX), inet_pton (только десятичное число только четверка, до 3 цифр, позволенных на компонент). gethostbyname и getaddrinfo обычно поддерживайте то же как inet_addr. Затем у Вас может быть все промежуточное. При проверке исправности входа я думаю, что последнее решение является самым безопасным. 010.010.010.010 допустимо для большинства инструментов, но не обязательно имейте в виду то же для всех, таким образом, лучше отклонить его. –  Stéphane Chazelas 31.01.2014, 15:25

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

function validateIP()
 {
         local ip=$1
         local stat=1
         if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
                OIFS=$IFS
                IFS='.'
                ip=($ip)
                IFS=$OIFS
                [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
                && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
                stat=$?
        fi
        return $stat
}

echo "Enter IP Address"
read ip
validateIP $ip

if [[ $? -ne 0 ]];then
  echo "Invalid IP Address ($ip)"
else
  echo "$ip is a Perfect IP Address"
fi
0
27.01.2020, 20:47
  • 1
    Это возвращает false для допустимых IP-адресов, например, 127.1 допустимый IP-адрес. –  Chris Down 31.01.2014, 14:27
  • 2
    Это также возвращает false для 0111.0111.0111.0111 или 08.08.08.08 (что один со значением, слишком большим для основной ошибки) –  Stéphane Chazelas 31.01.2014, 14:49
  • 3
    BTW, в зависимости от того, кого Вы спрашиваете, 08.08.08.08 допустимо или нет, и 010.010.010.010 средства 8.8.8.8 (наиболее распространенный) или 10.10.10.10 –  Stéphane Chazelas 31.01.2014, 14:57
  • 4
    @Stephane - Спасибо за Ваше внимание я думаю это 08.08.08.08 рассматривается как Octal value сервером, потому что 0, определяет Восьмеричное число, таким образом, сервер игнорирует то значение. –  124 31.01.2014, 15:04
  • 5
    @Stephane Chazelas диска, который я понимаю, почему большинство реализаций интерпретирует начальные нули как восьмеричные, но RFC 1123 конкретно, говорит, что все-числовой a.b.c.d отмечается точкой десятичное число. 010 должен быть десятичный 10 не десятичные 8. –  doneal24 31.01.2014, 16:18

Я думаю, что это должно покрыть его

$ octet="(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])"

Или избегать нулей слева:

$ octet="(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])"  

Можно затем использовать $octet:

$ ip4="^$octet\\.$octet\\.$octet\\.$octet$"
$ echo $ip4
^(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])$
$ [[ 123.234.12.34 =~ $ip4 ]] && echo y || echo n
y
$ [[ 123.234.12.345 =~ $ip4 ]] && echo y || echo n
n
2
27.01.2020, 20:47
  • 1
    @p.glez: Ваше редактирование не необходимо. Исходный "октет" regex будет соответствовать всем из "007", "07" и "7" должных к использованию ? квантор. Ваш regex не может соответствовать допустимому IP-адресу 127.001.001.001 –  glenn jackman 23.02.2015, 03:02

Теги

Похожие вопросы