Назад | Перейти на главную страницу

Найти широковещательный IPv4-адрес устройства

Мне нужно определить широковещательный адрес IPv4 устройства (если есть) с помощью сценария оболочки. Если их несколько, выберите один (например, первый по порядку / sbin / ip).

У меня есть решение, но оно мне не нравится, потому что оно делает предположения о формате вывода / sbin / ip, и я не знаю, насколько стабилен этот формат вывода во всех системах.

DEV=eth0
BROADCAST=`ip address show $DEV | grep 'inet .* brd ' | head -1 | sed -e 's/^.* brd \([0-9\.]*\) .*$/\1/'`
echo $BROADCAST

Разве в / proc / или / sys / нет чего-нибудь, что я могу просто пропустить? Почему нет?

Мне нужно, чтобы решение работало надежно, по крайней мере, в семействе Debian / Ubuntu Linux.


Изменить: это НЕ вопрос о магии sed / awk / grep. Вопрос в том:

Могу ли я ожидать, что ip (ifconfig в этом отношении) для разных архитектур и разновидностей Linux будет иметь один и тот же выходной формат, чтобы я мог надежно анализировать

Я бы не стал. Хотя ifconfig мертв и поэтому не должно сильно меняться, были внесены незначительные изменения в дистрибутивы, чтобы этот устаревший инструмент оставался в некоторой степени функциональным, поскольку многие люди, похоже, не хотят узнавать, как переключаться. Выход ip действительно не подходит для разбора IMO.

Если нет: есть ли другой способ вывести широковещательный IPv4-адрес интерфейса более предсказуемым образом?

На вашем месте я бы, вероятно, посмотрел на установку и использование такого инструмента, как фасад делать работу за вас. Я не думаю, что он дает вам широковещательный адрес напрямую, но должно быть тривиально взять адрес / сетевую маску и выполнить математические вычисления, чтобы получить широковещательный адрес.

Почему нет / proc / sys / net / ...

iproute2 подключается к ядру через NETLINK разъем. Ifconfig использует ioctl метод который устарел. Если вы хотите получить правильную информацию, не очищая вывод какой-либо программы из пользовательского пространства или не устанавливая что-либо, вам необходимо использовать один из этих API.

Если хочешь, можешь сделать что-нибудь вроде strace ip addr show или strace ifconfig чтобы увидеть, что именно делают эти инструменты для получения значений.

Я не знаю, почему, но это не вопрос для этого сайта. Так оно и есть. Если вы хотите «почему», обратитесь к разработчикам ядра.

Для Redhat широковещательный IP-адрес автоматически рассчитывается с использованием ipcalc - AFAIK нет файлов конфигурации, которые его содержат. Это также может помочь: Red Hat Docs - Файлы конфигурации интерфейса

Вы считали данные маршрутизации. Этот скрипт должен вернуть широковещательный адрес интернет-интерфейса:

ipcalc $(route | awk '$2 ~ /\*/ {print $1 "/" $3}') | \
    awk '/^Broadcast/ {print $2}'

Или этот, использующий ip route может возвращать несколько адресов.

for x in $(ip route show | awk '/^[1-9]/ {print $1}'); do 
    ipcalc $x | awk '/^Broadcast/ {print $2}'; 
done

ipcalc не может быть установлен по умолчанию.

awk твой друг.

ip a s dev $DEV | awk '/inet / {print $4}'