So erhalten Sie die IP-Adresse und den Namen der verbundenen Schnittstelle in Bash

577
xakepp35

Ein PC mit Onboard-Linux verfügt über mehrere Netzwerkschnittstellen, z. B. zwei Ethernet-Karten und einen WLAN-Adapter (Zahlen und Typen können variieren). Jede dieser Schnittstellen kann mit einem Netzwerk verbunden sein (und offline sein), und das Netzwerk kann mit dem Internet verbunden sein (die Website superuser.com ist erreichbar) und kann mit einem lokalen Netzwerk verbunden sein.

Ich möchte ein Bash-Skript schreiben, um (lokale) IP-Adresse und den Namen des Adapters zu erhalten, mit dem das Internet erreicht werden kann. Wenn mehrere verbunden sind - dies sollte derjenige sein, der von einem Browser verwendet wird, der "gefragt" wird, um die Webseiten von superuser.com zu laden . Wenn kein verbundenes Skript sollteecho "internet unavailble"

Wie schreibe ich eine Prüfbedingung für ein solches Skript? Wie könnte ich sogar alle vernetzungsfähigen Geräte /dev/*eines Systems durchlaufen ?

2
@ KamilMaciorowski Ich denke, dass Sie die Frage falsch verstanden haben. Ich bat um Iterationsmethode. Ich brauche keine Routen und Pläne, ich möchte wissen ... ein Platzhalter für Geräte. Ich kann da / dev / eth * nicht angeben, da die Schnittstelle beispielsweise enp3s0 heißen könnte oder es sich um einen WLAN-Adapter oder einen USB-Netzwerkadapter handeln könnte. xakepp35 vor 6 Jahren 1
Jeder Absatz in Ihrer Frage verlangt eine ganz andere Sache. "Wie erhalte ich den voreingestellten Schnittstellennamen?" "Warten Sie, nein, ich möchte nicht die Standardschnittstelle, ich möchte alle Schnittstellen" ... Der (gelöschte) Beitrag hat _ genau gemacht, was der zweite Absatz Ihrer Frage erfordert. grawity vor 6 Jahren 0
Ist Ihre grundlegende Frage, dass Sie einen Befehl wünschen, den Sie lokal ausführen können, der Sie darüber informiert, welche Schnittstelle den Datenverkehr zum Internet leitet? Hogstrom vor 6 Jahren 0
@ xakepp35 Ein Browser entscheidet nicht, welche Netzwerkschnittstelle verwendet werden soll. Die Art und Weise, wie Pakete ausgehen, wird von der Routingtabelle festgelegt AnonymousLurker vor 6 Jahren 0
@AnonymousLurker Sicheres Ding. Ich habe das so geschrieben, um die Formulierung zu vereinfachen. Wenn Sie "Browser" nicht mögen, kann ich ihn durch einen "Ping" -Befehl oder was auch immer ersetzen. xakepp35 vor 6 Jahren 0

1 Antwort auf die Frage

3
Kamil Maciorowski

Vielleicht müssen Sie nicht iterieren. In meinem Debian 9 (nur IPv4, ich bin mir nicht sicher, wie relevant es ist) kann ich Folgendes verwenden:

ip route get "$(host superuser.com | awk 'NR==1 ')" \ | grep -o "dev .* src [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" 

wo host(vom bind9-hostPaket) superuser.comin seine IP-Adresse konvertieren soll . Um Fehler usw. zu behandeln, müssen Sie die Pipe dekonstruieren und ein Skript mit etwas Logik um seine Teile erstellen.

Beispielausgabe:

dev wlan0 src 192.168.1.2 

Um trotzdem zu iterieren, schauen Sie in /sys/class/net:

cd /sys/class/net ls for interface in *; do printf "Doing something with %s\n" "$interface" done 

Diese Geräte sind zwar nicht unter /dev, zumindest in keinem meiner Systeme.

Besser ist das Hinzufügen von awk '` GAD3R vor 6 Jahren 0
Danke, ich denke, ich brauche die erste Option. Ich möchte einem Computer eine "Geräte-ID" zuweisen, die auf den HEX-Ziffern der lokalen IP-Adresse basiert. Es muss die IP-Adresse des Adapters sein, die für den Zugriff auf das Internet verwendet wird. Die Maschine kann mehrere Adapter haben, auch unterschiedliche Typen, daher muss ich den richtigen auswählen. Außerdem muss ich mich um den lokalen Administrator kümmern, wenn während des Skriptlaufs kein Adapter das Internet erreichen kann. xakepp35 vor 6 Jahren 0