Linux Ethernet Ports finden

Als ich den Post zu „Bandbreite Anzeigen“ schrieb, da habe ich nicht darauf geachtet, dass Interface-Namen je nach Distribution und anderen Dingen verschieden heissen. Dort geht das Script einfach davon aus, dass alle Ports mit eth anfangen. Es gibt im Tool ip zwar die Möglichkeit, einen Typ anzugeben, aber leider ist das Feld leer bei Ethernet-Interfaces und man kann nicht unterscheiden zwischen „echten“ und Sub-Interfaces. Mit der Option -json bekommt man deutlich mehr Informationen und mit dem Tool jq kann man gut filtern, aber selbst dann bekommt man nicht einfach alle Ethernet Ports sauber gefiltert. Und Tools wie ethtool brauchen root Rechte und dort ist das Filtern auch nicht trivial.

Aber es gibt einen Trick, der hilft. Man sucht nach dem Treiber der Interfaces und nur Ports haben einen. Die zeigen wir an. Und das geht so:

for INT in $(ip -br link show | awk '{print $1}'); do
driver=$(basename $(readlink /sys/class/net/$INT/device/driver/module) 2>/dev/null)
test -z $driver || echo $INT
done

Der Output des Befehls sind alle Ethernet-Interfaces. Man kann natürlich auch die Variable $driver verwenden, falls man wissen will, welche Treiber benutzt werden.

Wenn man diese for Schleife in das Bandbreiten-Script übernimmt, dann funktioniert es mit jeder Distribution. Und um zu vermeiden, dass Ports angezeigt werden, die gerade down sind, kann man das awk ergänzen um einen Filter:

awk 'match($2, "UP") {print $1}'
Linux Ethernet Ports finden