Posso obter apenas a lista de interfaces de rede do ip?

Posso obter apenas a lista de interfaces de rede do ip?

Estou procurando recuperar uma lista de interfaces de rede.

Atualmente estou retornando os resultados ip addre fazendo algumas pesquisas de regex/string na saída como esta:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever 
84: eth0@if85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link tentative 
       valid_lft forever preferred_lft forever

Eu realmente não me importo com todos os metadados, estou apenas procurando os nomes das interfaces. Então, eu gostaria de obter:

1: lo
84: eth0@if85

Existe uma maneira de filtrar os resultados do ip addrcomando? Definitivamente, posso fazer alguma outra mágica cli ou apenas magia regex em meu aplicativo, mas seria bom ter ipum filtro próprio.

Responder1

Sim você pode.

Usando grepcom PCRE( -P):

ip addr | grep -Po '^\d+:\s+\K[^:]+'
  • ^\d+:\s+correspondeu à parte antes do nome da interface no início, \Kdescarta a correspondência

  • [^:]+obtém a parte até a próxima :, ou seja, o nome da interface

Lógica semelhante usando sed:

ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'

No meu sistema:

% ip addr | grep -Po '^\d+:\s+\K[^:]+'
lo
eth0
wlan0

% ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'
lo
eth0
wlan0

O que você realmente deveria fazer:

O kernel do Linux fornece uma interface para espiar o hardware, ele é sysfsmontado em /sys.

Você pode obter o nome da interface simplesmente acessando o local apropriado do /sysdiretório /sys/class/net/com precisão.

No meu sistema:

% ls -1 /sys/class/net/
eth0
lo
wlan0

Cada um deles são diretórios, com os subdiretórios contendo arquivos e diretórios contendo todas as informações sobre a interface.

Aqui está a listagem do conteúdo do /sys/class/net/eth0diretório:

% ls -1 /sys/class/net/eth0                                    
addr_assign_type
address
addr_len
broadcast
carrier
carrier_changes
device
dev_id
dev_port
dormant
duplex
flags
gro_flush_timeout
ifalias
ifindex
iflink
link_mode
mtu
name_assign_type
netdev_group
operstate
phys_port_id
phys_port_name
phys_switch_id
power
queues
speed
statistics
subsystem
tx_queue_len
type
uevent

Resposta à pergunta editada:

Para obter o nome da interface junto com o índice:

grep:

ip addr | grep -o '^[0-9]\+:[^:]\+'

sed:

ip addr | sed -nE 's/^([[:digit:]]+:[^:]+).*/\1/p'

Para cada diretório de interface em /sys/class/net/, você pode ler o arquivo ifindex. Por exemplo, para interface eth0, o arquivo de índice é:

/sys/class/net/eth0/ifindex

informação relacionada