Kann ich nur die Liste der Netzwerkschnittstellen von der IP erhalten?

Kann ich nur die Liste der Netzwerkschnittstellen von der IP erhalten?

Ich möchte eine Liste der Netzwerkschnittstellen abrufen.

Derzeit gebe ich die Ergebnisse zurück ip addrund führe dann in der Ausgabe eine Regex-/String-Suche wie folgt durch:

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

Die ganzen Metadaten interessieren mich nicht wirklich, ich suche nur nach den Schnittstellennamen. Stattdessen hätte ich gerne:

1: lo
84: eth0@if85

Gibt es eine Möglichkeit, die Ergebnisse des ip addrBefehls zu filtern? Ich kann in meiner App definitiv andere CLI-Magie oder einfach Regex-Magie anwenden, aber es wäre schön, wenn es ipeinen eigenen Filter gäbe.

Antwort1

Ja, du kannst.

Verwendung grepmit PCRE( -P):

ip addr | grep -Po '^\d+:\s+\K[^:]+'
  • ^\d+:\s+stimmte mit dem Teil vor dem Schnittstellennamen am Anfang überein, \Kverwirft die Übereinstimmung

  • [^:]+erhält den Teil bis zum nächsten, :also den Schnittstellennamen

Ähnliche Logik mit sed:

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

Auf meinem System:

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

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

Was Sie wirklich tun sollten:

Der Linux-Kernel bietet eine Schnittstelle für den Einblick in die Hardware, sysfsauf der er gemountet ist /sys.

Sie können den Schnittstellennamen erhalten, indem Sie einfach zum entsprechenden Speicherort des /sysVerzeichnisses gehen /sys/class/net/.

Auf meinem System:

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

Dabei handelt es sich jeweils um Verzeichnisse mit Unterverzeichnissen, die Dateien und Verzeichnisse mit allen Informationen zur Schnittstelle enthalten.

Hier ist die Auflistung des /sys/class/net/eth0Verzeichnisinhalts:

% 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

Antwort auf die bearbeitete Frage:

So erhalten Sie den Schnittstellennamen zusammen mit dem Index:

grep:

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

sed:

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

Für jedes Schnittstellenverzeichnis in /sys/class/net/können Sie die Datei lesen ifindex. Für die Schnittstelle eth0lautet die Indexdatei beispielsweise:

/sys/class/net/eth0/ifindex

verwandte Informationen