Как узнать, какой интерфейс я использую для подключения к интернету?

48

У меня есть eth0 и wlan0 в соответствии с ifconfig, и я могу ping google.com. Как я могу узнать (с обычным пользователем, а не с правами root), какой интерфейс активен , например, каким интерфейсом пользовался ping (или что-то еще, ping не является обязательным)?

ПРИМЕЧАНИЕ: используя Ubuntu 11.04 или Fedora 14

LanceBaynes
источник
2
Представленные ниже решения, по-видимому, хотят, чтобы вы делали выводы сами, что не кажется правильным. (И все таблицы маршрутизации выглядят невероятно простыми!) Хотя я ищу эквивалент Windows, похоже, что «ip route get <ip-address>» скажет вам, какой интерфейс будет использоваться, если вы попытаетесь подключиться к данный IP-адрес.
mwardm
Связано с ошибкой сервера: найти интерфейс для маршрута к конкретному хосту (именно это я и искал, когда оказался здесь).
Wildcard

Ответы:

48

Вы можете использовать, routeчтобы найти маршрут по умолчанию:

$ 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

IfaceСтолбец в строке с назначения defaultуказывает, какой интерфейс используется.

работа
источник
1
@ Job в случае, если у нас есть IP-адрес, как мы можем определить, какой интерфейс он использует.
Bionix1441
1
Это не должно быть принятым ответом. Если iproute использовался для определения пользовательских правил маршрутизации, routeиспользовать нельзя. У @Torgeir есть правильный ответ.
Джозеф Гарроне
1
Этот ответ не правильный. Например (и с учетом тех же маршрутов, которые указаны в ответе), если вы пингуете 192.168.1.16 (компьютер в вашей локальной сети), запись, с которой начинается, 192.168.1.0...- это маршрут, который будет использоваться. Конечно, в этом случае это относится к тому же Iface, но это только потому, что у вас есть один интерфейс на вашем компьютере.
kdehairy
1
@Job Даже с google.com, если у вас есть два маршрута на каждом интерфейсе, будет выбрано совпадение с более длинной маской (не обязательно по умолчанию). Все, что по умолчанию означает, что если другой маршрут не найден, давайте посмотрим на этот :)
kdehairy
1
Я получаю строку "default ... eth0" и строку "default ... wlan0". Так какой из них по умолчанию?
AstroFloyd
26

Моя версия, которая в основном основана на этом и этом :

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

И это, экспериментально , для macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
Эбрахим Бягови
источник
1
Есть ли способ перевести это для OSX?
Джон Аллард
1
@JohnAllard: дайте мне знать, если мое обновление теперь дает правильный ответ для macOS.
Эбрахим Бягови
вам не нужно несколько труб, просто используйтеroute |awk '/^default/{print $NF}'
P ....
Я получаю две строки: «eth0» и «wlan0», так что я до сих пор не знаю, какая из них активна ...
AstroFloyd
9

В системах 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
источник
1
Пожалуйста, объясните, что делают эти команды. Кроме того, вы, вероятно, здесь достаточно безопасны, потому что вы знаете, каковы ваши значения, но, как правило, вы должны заключать в кавычки ссылки на переменные оболочки (если у вас нет веских причин не делать этого и вы уверены, что знаете, что делаете ).
G-Man говорит: «Восстановите Монику»
1
Готово, до некоторой степени. Только опубликовал это, потому что я не мог найти ничего, что сделал именно это. Я использую это в качестве обычного факта в манифесте марионетки ...
Торгейр,
Ваш ответ будет более правильным, если hostон является входным аргументом для скрипта. Поскольку маршрут (и, следовательно, интерфейс) может отличаться для разных ips.
kdehairy
6

Бег ifconfigдаст вам необходимую информацию.

Активный интерфейс будет иметь inet addrи покажет запись переданных данных, например, так:

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

Вы можете также использовать ip addrкоманду и все неактивные интерфейсы будут обозначены как имеющие: NO-CARRIER.

jasonwryan
источник
Поскольку OP не хочет быть пользователем root, может быть, вы должны указать полный путь к исполняемому файлу?
Чепанг
Ни одна из команд не требует повышенных привилегий.
Джейсонвриан
1
Ubuntu и Arch: оба работают с обычными привилегиями (хотя в Ubuntu это / sbin)
jasonwryan
1
@Shadur Не в моей установке Ubuntu 10.10, и согласно help.ubuntu.com/community/EnvironmentVariables значение по умолчанию $ PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan,
2
Это не обязательно поможет в системе с несколькими интерфейсами, как указано на плакате. Лучшим ответом будет использование routeкоманды, хотя она не обязательно будет надежной из-за маршрутизации. Маршрут по умолчанию не обязательно должен быть тем, чтобы попасть в Интернет, хотя часто это может быть.
user1801810
6

Один лайнер:

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

h0tw1r3
источник
Там есть свисающая цитата. Не работает вообще как есть
Krease
@Krease Автор обновил свой ответ
Вадим Котов
5

Получите сетевой интерфейс по умолчанию, обычно используемый для маршрутизации к «оставшемуся» Интернету, в отличие от DMZ, частной сети, хоста VM и т. Д., Которые обычно маршрутизируются явно.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
EugeneP
источник
это не всегда маршрут по умолчанию, который доставляет вас туда, куда вы хотите. Хотя ОП, скорее всего, использует маршрут по умолчанию для доступа в Интернет, это обобщение, и оно не всегда может быть верным. Слово предостережения
MelBurslan
Конечно, это только сетевой интерфейс по умолчанию. Если имеется несколько соединений, на самом деле следует говорить не о «подключении к Интернету», а о сетевом интерфейсе, используемом для маршрутизации к точному месту назначения.
EugeneP
Вам не нужно использовать несколько труб / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....
2

Команда ip route lsвыдаст список активных маршрутов и их источников:

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
источник
1

Используйте эту команду:

$ route | grep default | awk '{print $8}'
enp0s3
Ларри Кэтт
источник
[root @ linux1 network-scripts] # ​​route | grep default | awk '{print $ 8}' enp0s3 [root @ linux1 network-scripts] #
Ларри Кэтт
0

Если ваша машина имеет несколько интерфейсов (что я предполагаю), то нет одного интерфейса, который будет использоваться для подключения к Интернету.

В зависимости от пункта назначения, к которому вы подключаетесь, ваша система сверится с таблицей ip (той, которая отображается, когда вы выполняете routeкоманду), чтобы найти следующую надежду / маршрутизатор, когда она найдет, она будет использовать связанный с ней интерфейс.

Тем не менее, пожалуйста , обратитесь к @ Torgeir в ответ , как это делает именно то, что:

  1. Данный домен (жестко задан как google.com, что является единственным плохим моментом в ответе)
  2. Решает это ip
  3. Консультируется с таблицей ip для использования маршрута (и, следовательно, интерфейса).
kdehairy
источник