Jak uzyskać adres IP IPv6 w systemie Linux


35

Mam serwer Linux i chcę znaleźć główny adres IPv6 za pomocą jednego wiersza poleceń.

Moje dotychczasowe polecenie:

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

który pokazuje:

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

Ale chcę tylko jedno wystąpienie , aby wynik brzmiał:

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

napisz skrypt powłoki i umieść tam te polecenia: voila, utworzyłeś teraz „pojedyncze” polecenie.
akira

4
W przypadku IPv6 tak naprawdę nie zaleca się ograniczania do jednego adresu. Może istnieć wiele adresów globalnych, wiele adresów lokalnych dla łącza, wiele adresów lokalnych dla witryny ...
grawity

Odpowiedzi:


31
ip -6 addr

pokaże twoje adresy IPv6.


% ip -6 addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 inet6 ::1/128 scope host valid_lft forever preferred_lft forever... wciąż greppable
akira

1
To nie rozwiązuje zadanego pytania. OP chce, aby jeden wiersz poleceń pobierał jeden IPv6 (co prawdopodobnie oznacza główny publiczny). Więc albo ip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'czy ip -6 addr show dev eth0 | awk '/inet6/{print $2}'mogą być wykorzystane jako podstawa i OP może przedłużyć / edytować je za jego przypadku konkretnego zastosowania.
rwenz3l

6

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

Wynik działania /sbin/ip -6 addr | grep inet6wygląda mniej więcej tak:

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}'dzieli każdy ogranicznik ustawienia linii na jeden lub więcej białych spacji lub ukośnik. Potrzebujemy części 3 USD.

grep -v ^::1 | grep -v ^fe80aby wykluczyć dowolną linię zaczynającą się od ::1lub fe80.


jest zbyt dużo pipowania grep do awk, może to być collaspe w jednym awk `awk -F '[\ t] + | /' '$ 3 ==" :: 1 "{next;} 3 $ ~ / ^ fe80 ::/ { Kolejny ; } / 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

Jeśli chcesz losowy wybór jednego adresu IPv6

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

Jeśli potrzebujesz adresu IPv6 o najczęstszej nazwie dla pierwszego adaptera Ethernet

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

Jeśli chcesz tylko adres

$ /sbin/ifconfig eth0 |  awk '/inet6/{print $3}'
fe80::2ff:19ff:fe60:1a00/64

2

Użyj następującego polecenia, aby wyświetlić swój adres IP w systemie Linux:

ifconfig

Zwykle wygląda na to adres IPv6 2001:5c0:9168::/48. Jeśli masz do czynienia z konfliktem w adresie IP, wykonaj następujące kroki, aby ponownie ustawić adres IP:

  1. Aby przypisać adresy IPvv6, upewnij się, że masz zainstalowane narzędzia iproute2.
  2. Za ich pomocą zacznijmy przypisywać adresy IP.
  3. Upewnij się, że moduł ipv6 jest zainstalowany, czy nie.

Następnie użyj następującego polecenia, aby dodać nowy adres IP:

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

Następnie dodaj domyślny adres IP przez

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

Po zakończeniu instalacji wystarczy ponownie skonfigurować / zrestartować usługi obsługujące IPv6, takie jak Apache, SSH itp.


ifconfigjest przestarzały w Linuksie i nie powinien być dłużej używany. Nowoczesne dystrybucje Linuksa nawet nie instalują go już domyślnie (chyba że wymaga tego jakiś starożytny pakiet).
Michael Hampton

1

Po kilku drobnych poprawkach Twoja oryginalna próba zadziałałaby:

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

Dużą zmianą jest dodanie -oflagi, która powoduje wydrukowanie wpisów, po jednym w wierszu, co ułatwia przesuwanie po nich.


0

Po pierwsze, musisz pamiętać, że z IPv6 każda maszyna może mieć kilka adresów IPv6 i mogą one znajdować się w oddzielnych sieciach, a każdy z nich może być używany, w zależności od tego, gdzie chcesz dotrzeć.

Tak więc, zanim będziesz mógł odpowiedzieć na pytanie, jaki jest twój źródłowy adres IP, musisz zdecydować, gdzie wysyłasz ruch. Następnie możesz po prostu poprosić Linuksa o podanie adresu IPv6, który będzie źródłem podczas wysyłania ruchu do tego miejsca docelowego.

Jeśli wysyłasz go do „Internetu”, wybierz losowo globalny adres IPv6, np. Publiczny adres 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

To prosi Linuksa o drogę do tego miejsca docelowego. Perl analizuje szukany wynik, srca następnie drukuje następne pole.

Podając inny cel, możesz otrzymać inny adres źródłowy:

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'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.