Вопрос или проблема
В bash-скрипте я хочу получить глобальный IPv6-адрес моего устройства для данного сетевого адаптера (в моем случае ‘ens18’). Для начала я выполнил следующую команду:
ip -6 addr
Это дает мне следующий вывод, который содержит нужный мне адрес:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 fd00::3170:4ff:eff4:a4ab/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 6736sec preferred_lft 3136sec
inet6 2a02:8070:2982:4300:3170:4ff:eff4:a4ab/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 6736sec preferred_lft 3136sec
inet6 af60::3170:4ff:eff4:a4ab/64 scope link
valid_lft forever preferred_lft forever
3: br-7ac197bd041e: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::42:80ff:fe52:3481/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::42:6eff:fecf:5e6/64 scope link
valid_lft forever preferred_lft forever
6: veth074f8b0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::7073:40ff:fe59:aad0/64 scope link
valid_lft forever preferred_lft forever
8: vethe85ed67@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::5c09:65ff:fe34:34f4/64 scope link
valid_lft forever preferred_lft forever
Таким образом, глобальный IPv6-адрес – “2a02:8070:2982:4300:3170:4ff:eff4:a4ab”.
Как я могу надежно извлечь это значение из моего bash-скрипта?
Я бы начал с
ip -6 addr dev ens18 | awk '/inet6/ && $2 !~ /^f/ { print $2}'
где
dev ens18
указываетip
, чтобы запросить только дляens18
/inet6/ && $2 !~ /^f/
указывает awk фильтровать по ipv6, ip не начинающийся сf
{ print $2}
печатает значение
Обратите внимание, что ipv6, такие как fe80::
и fd00::
, являются локальными и адресами сайта.
более современный вариант XXI века использует
ip --json addr | jq '...'
(но я не могу разобраться в строке запроса json)
Ответ или решение
Получение глобального IPv6-адреса с помощью Bash-скрипта
Вопрос о том, как получить глобальный IPv6-адрес для конкретного сетевого адаптера, такого как ‘ens18’, является распространенной задачей для специалистов в области информационных технологий. В этом ответе мы рассмотрим пошаговый процесс для достижения этой цели, используя доступные инструменты командной строки.
Шаг 1: Основная команда
Для начала вы правильно использовали команду ip -6 addr
, которая выводит информацию обо всех настроенных IPv6-адресах. Однако, чтобы получить только нужный адрес для адаптера ens18
, лучше уточнить запрос.
Шаг 2: Фильтрация результатов
Чтобы извлечь глобальный IPv6-адрес из вывода команды, вы можете использовать следующую команду с awk
:
ip -6 addr show dev ens18 | awk '/inet6/ && $2 !~ /^f/ { print $2 }'
Разбор команды:
ip -6 addr show dev ens18
: Указывает утилитеip
отобразить только информацию для адаптераens18
.awk '/inet6/ && $2 !~ /^f/ { print $2 }'
:/inet6/
: Ищет строки, содержащие IPv6-адреса.$2 !~ /^f/
: Исключает адреса, начинающиеся сf
, поскольку они являются локальными (например,fd00::
иfe80::
).
Этот подход гарантирует, что вы получите только глобальные IPv6-адреса.
Шаг 3: Использование JSON вывода
Для более современных сценариев, использование JSON в Unix-подобных системах становится все более популярным. Вы можете использовать команду ip
вместе с jq
для обработки JSON-данных. Вот как это можно сделать:
ip --json addr show dev ens18 | jq -r '.[] | select(.family == "inet6" and .scope == "global") | .address'
Объяснение:
ip --json addr show dev ens18
: Эта команда возвращает информацию о адресах в формате JSON.jq -r
: Используется для обработки JSON-вывода.select(.family == "inet6" and .scope == "global")
: Фильтрует только глобальные адреса IPv6..address
: Извлекает значение адреса.
Заключение
Теперь у вас есть два способа получения глобального IPv6-адреса для сетевого адаптера ens18
. Первый метод использует простую текстовую фильтрацию с awk
, а второй – более совершенный подход с использованием JSON и jq
. Оба метода эффективно справляются с задачей, и вы можете выбрать тот, который лучше соответствует вашим потребностям.
Если у вас появятся дополнительные вопросы или необходимость в более глубоком понимании работы с IPv6, не стесняйтесь обращаться за помощью. Экспертное понимание сетевых технологий, таких как IPv6, имеет критическое значение в современном мире ИТ.