
Estou procurando recuperar uma lista de interfaces de rede.
Atualmente estou retornando os resultados ip addr
e 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 addr
comando? Definitivamente, posso fazer alguma outra mágica cli ou apenas magia regex em meu aplicativo, mas seria bom ter ip
um filtro próprio.
Responder1
Sim você pode.
Usando grep
com PCRE( -P
):
ip addr | grep -Po '^\d+:\s+\K[^:]+'
^\d+:\s+
correspondeu à parte antes do nome da interface no início,\K
descarta 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 é sysfs
montado em /sys
.
Você pode obter o nome da interface simplesmente acessando o local apropriado do /sys
diretó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/eth0
diretó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