
Estoy buscando recuperar una lista de interfaces de red.
Actualmente estoy devolviendo los resultados ip addr
y luego haciendo algunas búsquedas de expresiones regulares/cadenas a partir de resultados como este:
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
Realmente no me importan todos los metadatos, solo busco los nombres de las interfaces. Entonces me gustaría obtener:
1: lo
84: eth0@if85
¿Hay alguna forma de filtrar los resultados del ip addr
comando? Definitivamente puedo hacer alguna otra magia cli o simplemente magia de expresiones regulares en mi aplicación, pero sería bueno tener ip
un filtro.
Respuesta1
Sí tu puedes.
Usando grep
con PCRE( -P
):
ip addr | grep -Po '^\d+:\s+\K[^:]+'
^\d+:\s+
coincide con la parte antes del nombre de la interfaz al inicio,\K
descarta la coincidencia[^:]+
obtiene la porción hasta la siguiente:
, es decir, el nombre de la interfaz
Lógica similar usando sed
:
ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'
En mi sistema:
% ip addr | grep -Po '^\d+:\s+\K[^:]+'
lo
eth0
wlan0
% ip addr | sed -nE 's/^[[:digit:]]+:[[:blank:]]+([^:]+).*/\1/p'
lo
eth0
wlan0
Lo que realmente deberías hacer:
El kernel de Linux proporciona una interfaz para echar un vistazo al hardware, que está sysfs
montado en /sys
.
Puede obtener el nombre de la interfaz simplemente accediendo a la ubicación adecuada del /sys
directorio /sys/class/net/
con precisión.
En mi sistema:
% ls -1 /sys/class/net/
eth0
lo
wlan0
Cada uno de estos son directorios, los subdirectorios contienen archivos y los directorios tienen toda la información sobre la interfaz.
Aquí está la lista del contenido del /sys/class/net/eth0
directorio:
% 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
Respuesta a la pregunta editada:
Para obtener el nombre de la interfaz junto con el índice:
grep
:
ip addr | grep -o '^[0-9]\+:[^:]\+'
sed
:
ip addr | sed -nE 's/^([[:digit:]]+:[^:]+).*/\1/p'
Para cada directorio de interfaz en /sys/class/net/
, puede leer el archivo ifindex
. Por ejemplo, para la interfaz eth0
, el archivo de índice es:
/sys/class/net/eth0/ifindex