Как получить IPv6 IP-адрес в Linux

35

У меня есть сервер Linux, и я хочу найти основной адрес IPv6 с помощью одной командной строки.

Моя команда до сих пор:

$ ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'

который показывает:

2001:410:0:39:221:28ff:fe46:eef4
fe80::221:28ff:fe46:eef4

Но я хочу только одно вхождение , так что вывод гласит:

2001:410:0:39:221:28ff:fe46:eef4
Анкит Гоял
источник
напишите сценарий оболочки и поместите туда эти команды: вуаля, теперь вы создали «одиночную» команду.
Акира
4
При работе с IPv6 не рекомендуется ограничиваться одним адресом. Может быть несколько глобальных адресов, несколько локальных адресов ссылок, несколько локальных адресов сайтов ...
grawity

Ответы:

31
ip -6 addr

покажет ваши адреса IPv6.

Джим Г.
источник
% ip -6 addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 inet6 ::1/128 scope host valid_lft forever preferred_lft forever... еще greppable
Акира
1
Это не решает поставленный вопрос. OP хочет, чтобы единственная командная строка извлекала один IPv6 (что, вероятно, означает основной общедоступный). Так что либо ip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'или ip -6 addr show dev eth0 | awk '/inet6/{print $2}'может быть использован в качестве основы и OP может продлить / редактировать их для его использования конкретного случая.
rwenz3l
6

/sbin/ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80

Вывод /sbin/ip -6 addr | grep inet6выглядит примерно так:

inet6 ::1/128 scope host 
inet6 2001:123:456:55f::1/64 scope global 
inet6 fe80::62eb:69ff:fed2:d2a6/64 scope link 

awk -F '[ \t]+|/' '{print $3}'разбивает каждую строку, устанавливая разделители на один или несколько пробелов или косую черту. Часть, которая нам нужна, это 3 доллара.

grep -v ^::1 | grep -v ^fe80исключить любую строку, начинающуюся с ::1или fe80.

Цянь Чен
источник
Слишком много сообщений grep в awk, это может быть сжато в один awk `awk -F '[\ t] + | /' '$ 3 ==" :: 1 "{next;} $ 3 ~ / ^ fe80 ::/ { следующий ; } / inet6 / {print $ 3} '`
Archemar
3
$ /sbin/ifconfig | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link
      inet6 addr: fe80::211:22ff:fe33:4455/64 Scope:Link
      inet6 addr: ::1/128 Scope:Host

Если вы хотите случайный выбор одного адреса IPv6

$ /sbin/ifconfig | grep inet6 | head -n 1
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

Если вы хотите IPv6-адрес наиболее распространенного имени для первого адаптера Ethernet

$ /sbin/ifconfig eth0 | grep inet6
      inet6 addr: fe80::2ff:19ff:fe60:1a00/64 Scope:Link

Если вы просто хотите адрес

$ /sbin/ifconfig eth0 |  awk '/inet6/{print $3}'
fe80::2ff:19ff:fe60:1a00/64
RedGrittyBrick
источник
2

Используйте следующую команду для просмотра вашего IP-адреса в Linux:

ifconfig

Обычно адрес IPv6 выглядит так 2001:5c0:9168::/48. Если вы столкнулись с каким-либо конфликтом в вашем IP-адресе, выполните следующие шаги, чтобы снова установить IP-адрес:

  1. Чтобы назначить IPv6 IP-адреса, убедитесь, что у вас установлены инструменты iproute2.
  2. Используя их, давайте начнем назначать ваши IP-адреса.
  3. Убедитесь, что модуль ipv6 установлен или нет.

Затем используйте следующую команду для добавления нового ip:

ip -f inet6 addr add 2001:5c0:9168::2/64 dev eth0

После этого добавьте IP-адрес по умолчанию через

ip -f inet6 ro add default via 2001:5c0:9168::1 dev eth0

После завершения установки просто переконфигурируйте / перезапустите службы с поддержкой IPv6, такие как Apache, SSH и т. Д.

user1908924
источник
ifconfigустарел в Linux и больше не должен использоваться. Современные дистрибутивы Linux даже не устанавливают его по умолчанию (если этого не требует какой-то древний пакет).
Майкл Хэмптон
1

С несколькими небольшими изменениями ваша первоначальная попытка сработала бы:

ip -o -6 addr show eth0 | sed -e 's/^.*inet6 \([^ ]\+\).*/\1/'

Большим изменением является добавление -oфлага, который заставляет печатать записи, по одной на строку, что облегчает их запуск по sed.

Кит Гоган
источник
0

Во-первых, вы должны помнить, что с IPv6 любая машина может иметь несколько адресов IPv6, и они могут находиться в разных сетях, и любой из них может использоваться, в зависимости от того, где вы хотите достичь.

Итак, прежде чем вы сможете ответить на вопрос, какой IP-адрес вашего источника, вы должны решить, куда вы отправляете трафик. Затем вы можете просто попросить Linux сообщить вам, какой IPv6-адрес будет источником при отправке трафика в этот пункт назначения.

Если вы отправляете его в «Интернет», просто выберите случайный глобальный IPv6-адрес, например, общедоступный DNS-адрес Google.

ip r get to 2001:4860:4860::8888 | perl -ne '/src ([\w:]+)/ && print "$1\n"'
2001:db8:f387:c818:5:2:0:1000

Это запрашивает у Linux маршрут к этому месту назначения. Perl анализирует результат поиска srcи затем печатает следующее поле.

Предоставляя другое место назначения, вы можете получить другой адрес источника:

ip r get to ::1 | perl -ne '/src ([\w:]+)/ && print "$1\n"'
::1
Майкл Хэмптон
источник
0
ip addr show dev eth0 | sed -e's/^.*inet6 \(2001[^ ]*\)\/64 scope global dynamic.*$/\1/;t;d'
Вернер Нойманн
источник