Як дізнатися, який інтерфейс я використовую для підключення до Інтернету?


47

У мене є 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, якщо у вас два маршрути на іншому інтерфейсі, буде вибрано збіг із довшою маскою (не обов'язково за замовчуванням). Все, що означає за замовчуванням, - це те, що якщо іншого маршруту не знайдено, давайте
порадимось із

1
Я отримую рядок "за замовчуванням ... eth0" і рядок "за замовчуванням ... wlan0". То який із них є справжнім дефолтом?
AstroFloyd

25

Моя версія, яка в основному заснована на цьому і на цьому :

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.


Оскільки ОП не хоче мати корінь, можливо, ви повинні дати повний шлях до виконуваного файлу?
tshepang

Жодна команда не вимагає підвищених привілеїв.
Jasonwryan

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 Автор оновив свою відповідь
Вадим Котов

5

Отримайте мережевий інтерфейс за замовчуванням, який зазвичай використовується для маршрутизації до "залишився" Інтернету навпроти DMZ, приватної мережі, хоста VM тощо, які зазвичай явно маршрутизовані.

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

Не завжди маршрут за замовчуванням веде вас туди, куди ви хочете. Хоча ОП, швидше за все, використовує маршрут за замовчуванням, щоб дістатися до Інтернету, це узагальнення і не завжди може бути правдою. Слово обережності
Мельбурслан

Звичайно, це лише мережевий інтерфейс за замовчуванням. Якщо є кілька підключень, не слід говорити про "підключення до Інтернету", а про мережевий інтерфейс, який використовується для маршрутизації до точного пункту призначення.
EugeneP

Не потрібно використовувати декілька труб / затискачів,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 

1

Використовувати команду:

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

[root @ linux1 network-script] # route | grep за замовчуванням | awk '{print $ 8}' enp0s3 [root @ linux1 network-script] #
Larry Catt


0

Якщо ваша машина має декілька інтерфейсів (я припускаю), немає жодного інтерфейсу, який би використовувався для підключення до Інтернету.

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

Тим НЕ менше, будь ласка , зверніться до @ Torgeir в відповідь , як це робить саме те, що:

  1. Враховуючи домен (твердо кодований як google.com, що є єдиним поганим моментом у відповіді)
  2. Вирішує це ip
  3. Звертається до ip-таблиці щодо маршруту, який слід використовувати (і, отже, інтерфейс).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.