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}'