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

4

Estou procurando recuperar uma lista de interfaces de rede.

Atualmente, estou retornando os resultados de ip addr e, em seguida, fazendo uma pesquisa de regex / string a partir da saída assim:

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 pelos nomes das interfaces. Então eu gostaria de obter:

1: lo
84: eth0@if85

Existe uma maneira de filtrar os resultados do comando ip addr ? Eu definitivamente posso fazer alguma outra magia cli ou apenas magia regex no meu aplicativo, mas seria bom ter o filtro ip em si.

    
por enderland 24.06.2016 / 17:01

1 resposta

5

Sim, você pode.

Usando grep com PCRE ( -P ):

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

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

Lógica semelhante usando sed :

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

No meu sistema:

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

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

O que você realmente deve fazer:

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

Você pode obter o nome da interface chegando ao local apropriado do diretório /sys , /sys/class/net/ com precisão.

No meu sistema:

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

Cada um destes 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 diretório /sys/class/net/eth0 :

% 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

Responda à 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:]]+:[^:]+).*//p'

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

/sys/class/net/eth0/ifindex
    
por 24.06.2016 / 17:10