Как мне узнать, прослушивают ли какие-либо интерфейсы данный IP-адрес?

#linux #bash #rhel5

#linux #баш #rhel5

Вопрос:

Я поддерживаю сценарий bash, который выполняется на RHEL 5. Учитывая доменное имя, я хочу убедиться, что на текущем компьютере есть интерфейс, прослушивающий ожидаемый IP-адрес.

 # Check that the IP is bound to this host, to avoid running on the wrong machine.
IP=$(dig  short ${EXPECTED_SUBDOMAIN}.example.com | tail -n 1)

if ! $(/sbin/ifconfig 2>/dev/null | /bin/grep -q $IP) ; then
    echo "IP for ${EXPECTED_SUBDOMAIN} ($IP) doesn't appear to be on this host"
    exit 1
fi
 

Это прерывается, когда IP-адреса являются подстроками друг друга. Если мой ожидаемый IP-адрес равен 1.2.3.4 , он не завершается, если на компьютере есть IP-адрес (или даже маска подсети!) 11.2.3.4 или 1.2.3.40 .

Единственное решение, которое я вижу grep "inet addr:${IP} " , — это то, что поиск другого текста кажется грязным.

Есть ли более надежный способ узнать IP-адреса интерфейсов (не путаясь в таких вещах, как маски подсети) и сравнить их? Есть ли лучший подход?

Комментарии:

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

Ответ №1:

используйте word boundary в вашем grep:

 if ! $(/sbin/ifconfig 2>/dev/null | /bin/grep -qE "<$IP>" ; then
...
 

Комментарии:

1. Этот ответ был автоматически помечен как низкое качество. Если бы вы объяснили, как работает «граница слов», это дало бы лучший и более информативный ответ.

Ответ №2:

Попробуйте это:

  /sbin/ip addr | grep -Po 'inet K.*?(?=(/| ))'| /bin/grep -q "^$IP$"
 

Сопоставление начала и конца строки должно решить вашу проблему, если входные данные также фильтруются.

PS. Я нахожу ip addr лучше, чем ifconfig для обычных IP-адресов.