So erhalten Sie die IPv6-IP-Adresse unter Linux


35

Ich habe einen Linux-Server und möchte die IPv6-Hauptadresse über eine einzige Befehlszeile ermitteln.

Mein bisheriger Befehl:

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

welche Shows:

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

Ich möchte aber nur ein Vorkommen , damit die Ausgabe lautet:

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

Schreiben Sie ein Shell-Skript und geben Sie diese Befehle ein: voila, Sie haben jetzt einen "einzelnen" Befehl erstellt.
Akira

4
Beim Umgang mit IPv6 wird nicht wirklich empfohlen, sich auf eine einzelne Adresse zu beschränken. Es kann mehrere globale Adressen, mehrere
verbindungslokale

Antworten:


31
ip -6 addr

zeigt Ihre IPv6-Adressen an.


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

1
Dies löst die gestellte Frage nicht. OP möchte, dass eine einzige Befehlszeile ein IPv6 abruft (was wahrscheinlich das primäre öffentliche IPv6 bedeutet). Entweder als Basis verwendet ip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'oder ip -6 addr show dev eth0 | awk '/inet6/{print $2}'als Basis verwendet, und OP kann sie für seinen spezifischen Anwendungsfall erweitern / bearbeiten.
rwenz3l

6

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

Die Ausgabe von /sbin/ip -6 addr | grep inet6sieht ungefähr so ​​aus:

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}'Teilt die Trennzeichen für jede Zeileneinstellung in ein oder mehrere Leerzeichen oder einen Schrägstrich. Der Teil, den wir brauchen, sind die $ 3.

grep -v ^::1 | grep -v ^fe80um Zeilen auszuschließen, die mit ::1oder beginnen fe80.


Es gibt viel zu viel Piping von grep in awk, dies könnte zu einem einzelnen awk zusammengefasst werden: awk -F [\ t] + | / '' $ 3 == ":: 1" {next;} $ 3 ~ / ^ fe80 ::/ { Nächster ; } / 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

Wenn Sie eine zufällige Auswahl einer IPv6-Adresse wünschen

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

Wenn Sie die IPv6-Adresse des am häufigsten verwendeten Namens für den ersten Ethernet-Adapter möchten

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

Wenn Sie nur die Adresse wollen

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

2

Verwenden Sie den folgenden Befehl, um Ihre IP-Adresse unter Linux anzuzeigen:

ifconfig

Normalerweise sieht die IPv6-Adresse so aus 2001:5c0:9168::/48. Wenn Sie auf einen Konflikt in Ihrer IP stoßen, führen Sie die folgenden Schritte aus, um eine IP-Adresse erneut festzulegen:

  1. Stellen Sie zum Zuweisen von IPv6-IPs sicher, dass die iproute2-Tools installiert sind.
  2. Beginnen wir damit, Ihre IPs zuzuweisen.
  3. Stellen Sie sicher, dass das IPv6-Modul installiert ist oder nicht.

Verwenden Sie dann den folgenden Befehl, um eine neue IP-Adresse hinzuzufügen:

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

Anschließend fügen Sie die Standard-IP über hinzu

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

Nach Abschluss der Installation müssen Sie nur Ihre IPv6-fähigen Dienste wie Apache, SSH usw. neu konfigurieren / neu starten.


ifconfigist unter Linux veraltet und sollte nicht mehr verwendet werden. Moderne Linux-Distributionen installieren es nicht einmal mehr standardmäßig (es sei denn, ein altes Paket erfordert es).
Michael Hampton

1

Mit ein paar kleinen Änderungen hätte Ihr ursprünglicher Versuch funktioniert:

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

Die große Änderung besteht darin -o, dass das Flag hinzugefügt wird, um die Einträge auszudrucken, eine pro Zeile, wodurch das Überfahren erleichtert wird.


0

Erstens müssen Sie sich daran erinnern, dass bei IPv6 jeder Computer möglicherweise mehrere IPv6-Adressen hat und sich möglicherweise in separaten Netzwerken befindet. Je nachdem, wo Sie ihn erreichen möchten, kann auch eine dieser Adressen verwendet werden.

Bevor Sie also die Frage nach Ihrer Quell-IP-Adresse beantworten können, müssen Sie entscheiden, wohin Sie den Datenverkehr senden. Dann können Sie Linux einfach bitten, Ihnen mitzuteilen, welche IPv6-Adresse die Quelle ist, wenn Sie Datenverkehr an dieses Ziel senden.

Wenn Sie es an das Internet senden, wählen Sie einfach eine zufällige globale IPv6-Adresse aus, z. B. die öffentliche DNS-Adresse von Google.

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

Dies fragt Linux nach der Route zu diesem Ziel. Perl analysiert das Ergebnis srcund gibt dann das nächste Feld aus.

Wenn Sie ein anderes Ziel angeben, erhalten Sie möglicherweise eine andere Quelladresse:

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'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.