Em um script bash, quero obter o endereço IPv6 global da minha máquina para um determinado adaptador de rede (no meu caso, 'ens18'). Para começar, emiti o seguinte comando:
ip -6 addr
Isso me dá a seguinte saída, que contém o endereço que estou procurando:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 fd00::3170:4ff:eff4:a4ab/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 6736sec preferred_lft 3136sec
inet6 2a02:8070:2982:4300:3170:4ff:eff4:a4ab/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 6736sec preferred_lft 3136sec
inet6 af60::3170:4ff:eff4:a4ab/64 scope link
valid_lft forever preferred_lft forever
3: br-7ac197bd041e: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::42:80ff:fe52:3481/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::42:6eff:fecf:5e6/64 scope link
valid_lft forever preferred_lft forever
6: veth074f8b0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::7073:40ff:fe59:aad0/64 scope link
valid_lft forever preferred_lft forever
8: vethe85ed67@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP
inet6 af60::5c09:65ff:fe34:34f4/64 scope link
valid_lft forever preferred_lft forever
Então o endereço IPv6 global é "2a02:8070:2982:4300:3170:4ff:eff4:a4ab".
Como posso recuperar esse valor de forma confiável do meu script bash?
Eu começaria com
onde
dev ens18
digaip
para consultar somente paraens18
-deprecated
(para ser colocado depoisls
oushow
) filtrar IP de saída temporárioprimary
selecione primário (por exemplo, primeiro IP fornecido à interface)scope global
imprimir apenas endereço global (não imprimirá endereço de nível de link comofe80::
)/inet6/
diga ao awk para filtrar a linha cominet6
{ print $2}
valor de impressãoObserve que ipv6, como
fe80::
e,fd00::
são endereços locais e de site (esses são filtrados porscope global
sinalizador).uma solução mais do século XXI seria
(com
${OTHER_ARGS}
a solução do awk acima)Eu diria que em vez de analisar
ip
a saída ou depender de ferramentas comojs
(que precisa ser instalado), você pode começar ahostname -I
saída que simplesmente apresenta uma lista de todos os endereços IP atribuídos à máquina. Assim:Isso mostrará o primeiro endereço IPv6 que apareceu na lista, mesmo que seja link-local ou site-local. Você pode grepá-los também: