Wie finde ich heraus, über welche Schnittstelle ich mich mit dem Internet verbinde?


47

Ich habe eth0 und wlan0 nach ifconfig und ich kann ping google.com. Wie kann ich herausfinden (mit einem normalen Benutzer, nicht root), welche Schnittstelle aktiv ist , wie in, welche Schnittstelle hat der Ping (oder was auch immer, Ping ist nicht obligatorisch) verwendet?

HINWEIS: Verwenden von Ubuntu 11.04 oder Fedora 14


2
Die folgenden Lösungen scheinen zu wollen, dass Sie die Schlussfolgerung selbst ziehen, was nicht richtig zu sein scheint. (Und jeder der Routing - Tabellen aussehen unglaublich einfach!) Während ich für das Windows - Äquivalent suchen, scheint es , dass „ip route get <IP-Adresse>“ wird Ihnen sagen , welche Schnittstelle würde verwendet werden , wenn Sie ein , eine Verbindung herzustellen waren angegebene IP-Adresse.
Mwardm

Bezogen auf Serverfehler: Suchen Sie die Schnittstelle für die Route zu einem bestimmten Host (nach dieser habe ich gesucht, als ich hier gelandet bin).
Wildcard

Antworten:


48

Mit können routeSie Ihre Standardroute ermitteln:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     1      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

Die IfaceSpalte in der Zeile mit dem Ziel defaultgibt an, welche Schnittstelle verwendet wird.


1
@Job, falls wir eine IP-Adresse haben, wie können wir herausfinden, welche Schnittstelle sie verwendet.
Bionix1441

1
Dies sollte nicht die akzeptierte Antwort sein. Wenn iproute zum Definieren benutzerdefinierter Routing-Regeln verwendet wurde, routekann es nicht verwendet werden. @Torgeir habe die richtige Antwort.
Joseph Garrone

1
Diese Antwort ist nicht richtig. Wenn Sie beispielsweise (und die gleichen Routen wie in der Antwort angegeben) 192.168.1.16 (einen PC in Ihrem lokalen Netzwerk) anpingen, ist der Eintrag, der mit beginnt, 192.168.1.0...die verwendete Route. In diesem Fall bezieht es sich natürlich auf dasselbe Iface, aber das liegt nur daran, dass Sie eine Schnittstelle auf Ihrem Computer haben.
Kdehairy

1
@Job Auch bei google.com wird bei zwei Routen auf einer anderen Benutzeroberfläche die Übereinstimmung mit der längeren Maske ausgewählt (nicht unbedingt die Standardeinstellung). Alles, was Standard bedeutet, ist, dass wenn keine andere Route gefunden wird, konsultieren wir diese :)
Kdehairy

1
Ich erhalte eine Zeile "default ... eth0" und eine Zeile "default ... wlan0". Welches ist also der wirkliche Standard?
AstroFloyd

25

Meine Version, die im Grunde auf diesem und jenem basiert :

route | grep '^default' | grep -o '[^ ]*$'

Und das experimentell für macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'

1
Gibt es eine Möglichkeit, dies für OSX zu übersetzen?
John Allard

1
@JohnAllard: Lass mich wissen, ob mein Update dort für MacOS jetzt die richtige Antwort gibt.
Ebrahim Byagowi

Sie brauchen nicht mehrere Pipes, verwenden Sie einfachroute |awk '/^default/{print $NF}'
P ....

Ich erhalte zwei Zeilen: "eth0" und "wlan0", daher weiß ich immer noch nicht, welche aktiv ist ...
AstroFloyd

9

Auf GNU / Linux-Systemen:

#!/bin/sh

# host we want to "reach"
host=google.com

# get the ip of that host (works with dns and /etc/hosts. In case we get  
# multiple IP addresses, we just want one of them
host_ip=$(getent ahosts "$host" | awk '{print $1; exit}')

# only list the interface used to reach a specific host/IP. We only want the part
# between dev and src (use grep for that)
ip route get "$host_ip" | grep -Po '(?<=(dev )).*(?= src| proto)'

1
Bitte erklären Sie, was diese Befehle tun. Wahrscheinlich sind Sie hier auch ziemlich sicher, da Sie wissen, was Ihre Werte sind. Im Allgemeinen sollten Sie jedoch Shell-Variablenreferenzen angeben (es sei denn, Sie haben einen guten Grund, dies nicht zu tun, und Sie sind sicher, dass Sie wissen, was Sie tun ).
G-Man sagt, dass Monica

1
Bis zu einem gewissen Grad erledigt. Habe das nur gepostet, weil ich nichts gefunden habe, was genau das getan hat. Ich benutze dies als eine benutzerdefinierte Tatsache in einem Puppenmanifest ...
Torgeir

Ihre Antwort ist korrekter, wenn hostes sich um ein Eingabeargument für das Skript handelt. Da die Route (und damit die Schnittstelle) für verschiedene IPS unterschiedlich sein kann.
Kdehairy

6

Laufen ifconfiggibt dir die Informationen, die du brauchst.

Die aktive Schnittstelle hat eine inet addrund zeigt eine Aufzeichnung der übertragenen Daten wie folgt:

RX bytes:1930741 (1.8 Mb)  TX bytes:204768 (199.9 Kb)

Sie können auch die Verwendung ip addrBefehl und alle inaktiven Schnittstellen werden als mit bezeichnet werden: NO-CARRIER.


Da OP nicht root sein will, solltest du vielleicht den vollständigen Pfad zur ausführbaren Datei angeben?
Tshepang

Keiner der Befehle erfordert erhöhte Berechtigungen.
Jasonwryan

1
Ubuntu und Arch: beide laufen mit normalen Rechten (obwohl es unter Ubuntu / sbin ist)
jasonwryan

1
@ Shadur Nicht auf meiner Installation von Ubuntu 10.10 und laut help.ubuntu.com/community/EnvironmentVariables ist der Standardwert für $ PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan

2
Dies wird auf einem System mit mehreren Schnittstellen nicht unbedingt helfen, wie auf dem Poster angegeben. Eine bessere Antwort ist die Verwendung des routeBefehls, der jedoch aufgrund des Routings nicht unbedingt narrensicher ist. Die Standardroute muss nicht diejenige sein, die zum Internet führt, auch wenn dies häufig der Fall ist.
user1801810

6

Einzeiler:

ip route get 8.8.8.8 | sed -n 's/.*dev \([^\ ]*\) table.*/\1/p'


Da ist ein baumelndes Zitat. Funktioniert überhaupt nicht wie sie ist
Krease

@Krease Author hat seine Antwort aktualisiert
Vadim Kotov

5

Verwenden Sie die Standard-Netzwerkschnittstelle, die normalerweise zum Weiterleiten an das "verbleibende" Internet verwendet wird, im Gegensatz zu DMZ, privatem Netzwerk, VM-Host usw., die normalerweise explizit weitergeleitet werden.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0

Es ist nicht immer die Standardroute, die Sie dorthin bringt, wo Sie möchten. Obwohl das OP höchstwahrscheinlich die Standardroute verwendet, um ins Internet zu gelangen, handelt es sich um eine Verallgemeinerung, die möglicherweise nicht immer zutrifft. Ein Wort der Vorsicht
MelBurslan

Klar, es ist nur die Standard-Netzwerkschnittstelle. Wenn es mehrere Verbindungen gibt, sollte man nicht wirklich von "Herstellen einer Verbindung zum Internet" sprechen, sondern eher von einer Netzwerkschnittstelle, die zum Weiterleiten an das genaue Ziel verwendet wird.
EugeneP

Sie müssen nicht mehrere Pipes / Greps verwenden,ip -4 route ls |awk '/^default/{print $5}'
P ....

2

Der Befehl ip route lsgibt eine Liste der aktiven Routen und ihrer Quellen an:

caleburn: ~/ >ip route ls
192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.7 
default via 192.168.10.254 dev eth0 

1

Befehl verwenden:

[root@linux1 network-scripts]# route|grep default | awk '{print $8}'
enp0s3

[root @ linux1 Netzwerk-Skripte] # route | grep default | awk '{print $ 8}' enp0s3 [root @ linux1 Netzwerk-Skripte] #
Larry Catt


0

Wenn Ihr Computer über mehrere Schnittstellen verfügt (von denen ich annehme), wird für die Verbindung zum Internet keine einzige Schnittstelle verwendet.

Abhängig von dem Ziel, zu dem Sie eine Verbindung herstellen, durchsucht Ihr System die IP-Tabelle (die beim Ausführen des routeBefehls angezeigte ), um den nächsten Hope / Router zu finden. Wenn sie einen findet, verwendet das System die ihr zugeordnete Schnittstelle.

Bitte lesen Sie die Antwort von @ torgeir, da es genau das tut:

  1. Angesichts einer Domain (hartcodiert als google.com, was der einzig schlechte Punkt in der Antwort ist)
  2. Löst die IP auf
  3. Konsultiert die IP-Tabelle für die zu verwendende Route (und damit die Schnittstelle).
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.