Как получить глобальный IPv6-адрес текущей машины?

Вопрос или проблема

В 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 }'

Разбор команды:

  1. ip -6 addr show dev ens18: Указывает утилите ip отобразить только информацию для адаптера ens18.
  2. 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, имеет критическое значение в современном мире ИТ.

Оцените материал
Добавить комментарий

Капча загружается...