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


48

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

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


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

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.


Поскольку 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'


Там есть свисающая цитата. Не работает вообще как есть
Krease

@Krease Автор обновил свой ответ
Вадим Котов

5

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

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

это не всегда маршрут по умолчанию, который доставляет вас туда, куда вы хотите. Хотя ОП, скорее всего, использует маршрут по умолчанию для доступа в Интернет, это обобщение, и оно не всегда может быть верным. Слово предостережения
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 



0

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

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

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

  1. Данный домен (жестко задан как google.com, что является единственным плохим моментом в ответе)
  2. Решает это ip
  3. Консультируется с таблицей ip для использования маршрута (и, следовательно, интерфейса).
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.