Мне нужно определить широковещательный адрес 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, чтобы иметь один и тот же выходной формат, чтобы я мог надежно анализировать, например. широковещательный адрес IPv4 интерфейса из него?cat
?Могу ли я ожидать, что 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}'