Jak dowiedzieć się, którego interfejsu używam do łączenia się z Internetem?

47

Mam eth0 i wlan0 zgodnie z ifconfig i mogę ping google.com. Jak mogę dowiedzieć się (z normalnym użytkownikiem, nie rootem), który interfejs jest aktywny , ponieważ w jakim interfejsie używał ping (lub cokolwiek, ping nie jest obowiązkowy)?

UWAGA: używając Ubuntu 11.04 lub Fedora 14

LanceBaynes
źródło
2
Poniższe rozwiązania wydają się wymagać od ciebie wnioskowania, co nie wydaje się właściwe. (I niesłyszących tablice routingu wyglądać niezwykle proste!) Podczas gdy szukam odpowiednika systemu Windows, wydaje się, że „ip route get <adres IP>” powie który interfejs będzie stosować jeśli było próbować połączyć się z podany adres IP.
mwardm
Powiązane z błędem serwera: znajdź interfejs do trasy do konkretnego hosta (tego właśnie szukałem, kiedy tu znalazłem).
Wildcard

Odpowiedzi:

48

Możesz użyć, routeaby znaleźć domyślną trasę:

$ 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

IfaceKolumna w wierszu z przeznaczenia defaultinformuje interfejs, który jest używany.

Praca
źródło
1
@ Job w przypadku, gdy mamy adres IP, w jaki sposób możemy znaleźć używany interfejs.
Bionix1441,
1
To nie powinna być zaakceptowana odpowiedź. Jeśli do zdefiniowania niestandardowych reguł routingu użyto iproute, routenie można go użyć. @Torgeir ma odpowiedź wrighta.
Joseph Garrone
1
Ta odpowiedź jest nieprawidłowa. Na przykład (i biorąc pod uwagę te same trasy wyświetlane w odpowiedzi), jeśli pingujesz 192.168.1.16 (komputer w sieci lokalnej), pozycja, która zaczyna się od, 192.168.1.0...to trasa, która zostanie użyta. Oczywiście w tym przypadku odnosi się do tego samego Iface, ale dzieje się tak tylko dlatego, że masz jeden interfejs na swoim komputerze.
kdehairy
1
@Job Nawet w przypadku google.com, jeśli masz dwie trasy w innym interfejsie, zostanie wybrane dopasowanie z dłuższą maską (niekoniecznie domyślne). Domyślnie wszystko oznacza, że jeśli nie zostanie znaleziona żadna inna trasa, skonsultujmy się z nią :)
kdehairy
1
Dostaję wiersz „default… eth0” i wiersz „default ... wlan0”. Który z nich jest naprawdę domyślny?
AstroFloyd
25

Moja wersja, która jest w zasadzie oparta na tym i tym :

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

A to eksperymentalnie dla macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
Ebrahim Byagowi
źródło
1
czy możesz to przetłumaczyć na OSX?
John Allard
1
@JohnAllard: daj mi znać, jeśli moja aktualizacja daje teraz poprawną odpowiedź dla systemu macOS.
Ebrahim Byagowi,
nie potrzebujesz wielu rur, po prostu użyjroute |awk '/^default/{print $NF}'
P ....
Dostaję dwie linie: „eth0” i „wlan0”, więc wciąż nie wiem, która z nich jest aktywna ...
AstroFloyd
9

W systemach GNU / Linux:

#!/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)'
Torgeir
źródło
1
Wyjaśnij, co robią te polecenia. Prawdopodobnie jesteś tutaj całkiem bezpieczny, ponieważ wiesz, jakie są twoje wartości, ale ogólnie powinieneś cytować odwołania do zmiennych powłoki (chyba że masz dobry powód, aby tego nie robić i jesteś pewien, że wiesz, co robisz ).
G-Man mówi „Reinstate Monica”
1
Zrobione, do pewnego stopnia. Wysłałem to tylko, ponieważ nie mogłem znaleźć niczego, co dokładnie to zrobiłoby. Używam tego jako niestandardowego faktu w manifestie lalek ...
Torgeir
Twoja odpowiedź jest bardziej poprawna, jeśli hostjest argumentem wejściowym do skryptu. Ponieważ trasa (i stąd interfejs) może być różna dla różnych IP.
kdehairy
6

Bieganie ifconfigzapewni ci potrzebne informacje.

Aktywny interfejs będzie miał inet addri wyświetli zapis przesłanych danych, taki jak:

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

Można również użyć ip addrpolecenia oraz wszelkie nieaktywne interfejsy zostaną oznaczone jako mające: NO-CARRIER.

jasonwryan
źródło
Ponieważ OP nie chce być rootem, może powinieneś podać pełną ścieżkę do pliku wykonywalnego?
tshepang
Żadna z komend nie wymaga podwyższonych uprawnień.
jasonwryan
1
Ubuntu i Arch: oba działają z normalnymi uprawnieniami (chociaż na Ubuntu jest to / sbin)
jasonwryan
1
@Shadur Nie w mojej instalacji Ubuntu 10.10 i zgodnie z help.ubuntu.com/community/EnvironmentVariables domyślną zmienną $ PATH jest/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan
2
To niekoniecznie pomoże w systemie z wieloma interfejsami, jak wskazał plakat. Lepszą odpowiedzią jest użycie routepolecenia, choć niekoniecznie byłoby to niezawodne ze względu na routing. Domyślna trasa nie musi być tą, która umożliwia dostęp do Internetu, choć często może być.
user1801810,
6

Jedna wkładka:

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

h0tw1r3
źródło
Jest tam wiszący cytat. W ogóle nie działa jak jest
Krease
@Krease Autor zaktualizował swoją odpowiedź
Vadim Kotov
5

Uzyskaj domyślny interfejs sieciowy zwykle używany do kierowania do „pozostałego” Internetu w przeciwieństwie do DMZ, sieci prywatnej, hosta VM itp., Które są zwykle kierowane jawnie.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
EugeneP
źródło
nie zawsze jest to domyślna trasa, która prowadzi cię tam, gdzie chcesz. Chociaż OP najprawdopodobniej korzysta z domyślnej trasy dostępu do Internetu, jest to uogólnienie i może nie zawsze być prawdziwe. Słowo ostrzeżenia
MelBurslan,
Jasne, to tylko domyślny interfejs sieciowy. Jeśli istnieje wiele połączeń, tak naprawdę nie należy mówić o „łączeniu się z Internetem”, a raczej o interfejsie sieciowym używanym do routingu do konkretnego miejsca docelowego.
EugeneP,
Nie musisz używać wielu rur / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....
2

Polecenie ip route lswyświetli listę aktywnych tras i ich źródeł:

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 
Shadur
źródło
1

Użyj polecenia:

[root@linux1 network-scripts]# route|grep default | awk '{print $8}'
enp0s3
Larry Catt
źródło
[root @ linux1 network-scripts] # ​​route | grep default | awk '{print $ 8}' enp0s3 [root @ linux1 network-scripts] #
Larry Catt
0

Jeśli twój komputer ma wiele interfejsów (co zakładam), nie ma jednego interfejsu, który będzie używany do łączenia się z Internetem.

W zależności od miejsca docelowego, z którym się łączysz, twój system sprawdzi tabelę ip (tę pokazaną po wykonaniu routepolecenia), aby znaleźć następną nadzieję / router, gdy ją znajdzie, użyje interfejsu z nią powiązanego.

To powiedziawszy, należy zapoznać się @ Torgeir za odpowiedź , jak to robi dokładnie to:

  1. Biorąc pod uwagę domenę (zakodowaną jako google.com, co jest jedynym złym punktem w odpowiedzi)
  2. Rozwiązuje to ip
  3. Sprawdza tablicę ip w celu znalezienia trasy do użycia (a więc i interfejsu).
kdehairy
źródło