#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-адресов.