Come ottenere l'indirizzo IP IPv6 in Linux


35

Ho un server Linux e voglio trovare l'indirizzo IPv6 principale tramite un'unica riga di comando.

Il mio comando finora:

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

che mostra:

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

Ma voglio solo un'occorrenza , in modo che l'output reciti:

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

scrivere uno script di shell e inserire quei comandi lì: voilà, ora hai creato un comando "singolo".
Akira,

4
Quando si ha a che fare con IPv6, in realtà non è consigliabile limitarsi a un singolo indirizzo. Possono esserci più indirizzi globali, più indirizzi locali di collegamento, più indirizzi locali di sito ...
Grawity

Risposte:


31
ip -6 addr

mostrerà i tuoi indirizzi IPv6.


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

1
Questo non risolve la domanda dichiarata. OP vuole che una sola riga di comando recuperi un IPv6 (che probabilmente significa quello pubblico primario). Quindi ip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'o ip -6 addr show dev eth0 | awk '/inet6/{print $2}'può essere usato come base e OP può estenderli / modificarli per il suo caso d'uso specifico.
rwenz3l,

6

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

L'output di /sbin/ip -6 addr | grep inet6assomiglia a questo:

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}'suddivide ciascuna linea impostando i delimitatori come uno o più spazi bianchi o una barra. La parte di cui abbiamo bisogno è $ 3.

grep -v ^::1 | grep -v ^fe80per escludere qualsiasi riga che inizia con ::1o fe80.


c'è troppa piping di grep in awk, questo potrebbe essere collaspe in un singolo awk `awk -F '[\ t] + | /' '$ 3 ==" :: 1 "{next;} $ 3 ~ / ^ fe80 ::/ { Il prossimo ; } / inet6 / {print $ 3} ''
Archemar il

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

Se si desidera una selezione casuale di un indirizzo IPv6

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

Se si desidera l'indirizzo IPv6 del nome più comune per il primo adattatore Ethernet

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

Se vuoi solo l'indirizzo

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

2

Utilizzare il comando seguente per visualizzare il proprio indirizzo IP su Linux:

ifconfig

Normalmente, l'indirizzo IPv6 sembra 2001:5c0:9168::/48. Se si riscontrano conflitti nel proprio IP, seguire i passaggi seguenti per impostare nuovamente un indirizzo IP:

  1. Per assegnare IP IPv6, assicurati di aver installato gli strumenti iproute2.
  2. Usandoli, iniziamo ad assegnare i tuoi IP.
  3. Assicurarsi che il modulo ipv6 sia installato o meno.

Quindi, utilizzare il comando seguente per aggiungere un nuovo ip:

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

Successivamente, aggiungi l'ip predefinito tramite

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

Dopo aver completato l'installazione, basta riconfigurare / riavviare i servizi abilitati per IPv6, come Apache, SSH ecc.


ifconfigè obsoleto su Linux e non dovrebbe più essere utilizzato. Le moderne distribuzioni Linux non la installano più per impostazione predefinita (a meno che alcuni pacchetti antichi non lo richiedano).
Michael Hampton,

1

Con alcune piccole modifiche, il tuo tentativo originale avrebbe funzionato:

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

Il grande cambiamento in questo caso è l'aggiunta della -obandiera per far sì che le voci vengano stampate, una per riga, il che semplifica il passaggio su di esse.


0

Innanzitutto, è necessario ricordare che con IPv6 qualsiasi macchina può avere diversi indirizzi IPv6 e che possono trovarsi su reti separate e ognuna di esse potrebbe essere utilizzata, a seconda di dove si desidera raggiungere.

Quindi, prima di poter rispondere alla domanda su quale sia il tuo indirizzo IP di origine, devi decidere dove inviare il traffico. Quindi puoi semplicemente chiedere a Linux di dirti quale indirizzo IPv6 sarà la fonte quando invii traffico a quella destinazione.

Se lo stai inviando a "Internet", scegli un indirizzo IPv6 globale a caso, ad esempio l'indirizzo DNS pubblico di Google.

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

Questo richiede a Linux il percorso verso quella destinazione. Perl analizza il risultato cercato srce quindi stampa il campo successivo.

Fornendo una destinazione diversa, potresti ricevere un indirizzo di origine diverso:

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.