Como obter o endereço IP IPv6 no Linux


35

Eu tenho um servidor Linux e quero encontrar o endereço IPv6 principal por meio de uma única linha de comando.

Meu comando até agora:

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

que mostra:

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

Mas eu quero apenas uma ocorrência , para que a saída leia:

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

escreva um script shell e coloque esses comandos: voila, você criou um comando "único".
akira

4
Ao lidar com o IPv6, não é realmente recomendável limitar a um único endereço. Pode haver vários endereços globais, vários endereços de ligação local, vários endereços de sites locais ...
grawity

Respostas:


31
ip -6 addr

mostrará seus endereços IPv6.


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

1
Isso não resolve a questão declarada. O OP deseja que uma única linha de comando recupere um IPv6 (o que provavelmente significa o principal público). Portanto, um ip -6 addr show dev eth0 | sed -n 's|^.*inet6 \([^ ]*/64\).*$|\1|p'ou ip -6 addr show dev eth0 | awk '/inet6/{print $2}'pode ser usado como base e o OP pode estendê-los / editá-los para seu caso de uso específico.
rwenz3l

6

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

A saída de se /sbin/ip -6 addr | grep inet6parece com isso:

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}'divide cada delimitador de configuração de linha para ser um ou mais espaços em branco ou uma barra. A parte que precisamos é de US $ 3.

grep -v ^::1 | grep -v ^fe80para excluir qualquer linha que comece com ::1ou fe80.


existe muita tubulação de grep no awk, isso pode ser colaspe em um único awk `awk -F '[\ t] + | /' '$ 3 ==" :: 1 "{next;} $ 3 ~ / ^ fe80 ::/ { Próximo ; } / inet6 / {print $ 3} ''
Archemar 26/03

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 você deseja uma seleção aleatória de um endereço IPv6

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

Se você deseja o endereço IPv6 do nome mais comum para o primeiro adaptador Ethernet

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

Se você quer apenas o endereço

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

2

Use o seguinte comando para visualizar seu endereço IP no Linux:

ifconfig

Normalmente, o endereço Ipv6 parece 2001:5c0:9168::/48. Se você estiver enfrentando algum conflito no seu IP, siga as etapas abaixo para definir um endereço IP novamente:

  1. Para atribuir IPs IPv6, verifique se você possui as ferramentas iproute2 instaladas.
  2. Usando-os, vamos começar a atribuir seus IPs.
  3. Certifique-se de que o módulo ipv6 esteja instalado ou não.

Em seguida, use o seguinte comando para adicionar novo ip:

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

Depois, adicione o ip padrão via

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

Após concluir a instalação, basta reconfigurar / reiniciar os serviços habilitados para IPv6, como Apache, SSH etc.


ifconfigestá obsoleto no Linux e não deve mais ser usado. As distribuições modernas do Linux nem o instalam mais por padrão (a menos que algum pacote antigo exija).
Michael Hampton

1

Com alguns pequenos ajustes, sua tentativa original teria funcionado:

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

A grande mudança é a adição da -obandeira para fazer com que as entradas sejam impressas, uma por linha, o que facilita a execução sobre elas.


0

Primeiro, lembre-se de que, com o IPv6, qualquer máquina pode ter vários endereços IPv6, e eles podem estar em redes separadas, e qualquer um deles pode ser usado, dependendo de onde você deseja alcançar.

Portanto, antes de poder responder à pergunta sobre qual é o seu endereço IP de origem, você deve decidir para onde está enviando o tráfego. Em seguida, você pode simplesmente pedir ao Linux para lhe dizer qual endereço IPv6 será a fonte quando você enviar tráfego para esse destino.

Se você estiver enviando para "a Internet", basta escolher um endereço IPv6 global aleatoriamente, por exemplo, o endereço DNS público do Google.

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

Isso pede ao Linux a rota para esse destino. Perl analisa o resultado procurando srce depois imprime o próximo campo.

Ao fornecer um destino diferente, você pode receber um endereço de origem diferente:

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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.