Як я можу отримати шлюз за замовчуванням у LINUX з урахуванням пункту призначення?


11

Я намагаюся отримати шлюз за замовчуванням, використовуючи призначення 0.0.0.0

я використав цю команду: netstat -rn | греп 0,0,0,0

і він повертає цей список:

Destination - Gateway      - Genmask         - Flags - MSS - Window - irtt - Iface
10.9.9.17   - 0.0.0.0      - 255.255.255.255 - UH    - 0     0        0    - tun0
133.88.0.0  - 0.0.0.0      - 255.255.0.0     - U     - 0     0        0    - eth0
0.0.0.0     - 133.88.31.70 - 0.0.0.0         - UG    - 0     0        0    - eth0

Моя мета тут - пінг-шлюз за замовчуванням, використовуючи призначення 0,0.0.0; таким чином, це "133.88.31.70"; але цей повертає список через використання "grep".

Питання: Як мені отримати лише шлюз за замовчуванням? Мені знадобиться це для мого сценарію bash, щоб визначити, чи мережне підключення працює чи ні.

Відповіді:


21
DEFAULT_ROUTE=$(ip route show default | awk '/default/ {print $3}')
ping -c 1 $DEFAULT_ROUTE

Це повинно вирішити вашу проблему.


@Suezy Ha! Подивитися? awk!
Джеремі Пауелл

закрити невідповідність однієї котирування / близької дужки на кінці. Я думаю - інакше працює чудово!
Марк К Коуан

3
Я бачив досить багато відповідей в Інтернеті з цією командою, але не з них пояснюється, чому використовується "показ за замовчуванням". Насправді "ip route show" без жодного параметра робить для мене абсолютно те саме. Отже, моє запитання: чому в команді є "за замовчуванням"? Що це означає?
користувач658991

@ user658991 Я був у цій кролячій норі, і ти абсолютно прав. Це не робить нічого на найбільш поширених версіях ipтам. Насправді ip route showце псевдонім для, ip route listі ви можете перевірити, чи є man ipв цьому підкоманді синтаксис ip route { list | flush } SELECTOR... І жоден з цих дійсних вибраних селекторів не є default. Я відчуваю, що ip route show table default треба робити те, що ми хочемо, але, на жаль, це не так. Нікому іншому, теж ip route show | awk '/^default/{print $3}'
підходимо

5
 ip route show default 0.0.0.0/0

Ця команда набагато швидше, ніж ip route | grepза замовчуванням у системі з багатьма (10000+) маршрутами

Шукайте, наприклад, мій маршрутизатор з повним BGP та ручним маршрутом за замовчуванням як резервне копіювання

router:~# time ip route show default 0.0.0.0/0
default via XXX.XXX.192.254 dev eth0.123 

real    0m0.707s
router:~# time ip route | grep default
default via XXX.XXX.192.254 dev eth0.123 

real    0m8.596s
  • тому що ip route show default showвсі маршрути для мене не лише за замовчуванням
  • оскільки ip route getне приймає за замовчуванням або 0,0.0,0/0 як параметр

+1 для демонстрації прямої нативної фільтрації через iproute2 ! Є так багато випадків, коли цей дивовижний набір утиліт є більш точним, надійним та виконавським, ніж (правда, творчий) застарілий текстовий текст Linux
RubyTuesdayDONO

1
Це чудова відповідь! але я все ще трохи збентежена документацією iproute2. Що означає "за замовчуванням" у команді? Якщо я правильно читаю документ, ця команда повинна відповідати "ip route show to default 0/0", я прав? що таке формат "0/0"?
користувач658991

3

ip route show defaultслід зробити фокус для шлюзу за замовчуванням, або ви можете використовувати, ip route get <someip>щоб побачити, яким маршрутом є певна IP-адреса.


Я спробував ip route, і він відображає список для всіх шлюзів .. і так, за замовчуванням також відображається внизу. Дякую за це. =) Але моя мета тут - отримати IP-адресу, використовувану для цього шлюзу за замовчуванням. Використовуючи bash script, я пропущу цей пінг, щоб перевірити, чи він працює чи ні.
Suezy

Я отримую чотири записи для "показ за замовчуванням". "ip route show default | awk '/ default / {print $ 3}'" повинен отримати вам лише IP-адресу.
Девід Пашлі

2

Якщо ви хочете зробити це за допомогою netstat(тож він буде працювати на чомусь, що НЕ Linux ), загальним рішенням є:

netstat -rn | grep '^\(default\|0\.0\.0\.0\)' | awk '{print $2}'

Це показує таблиці маршрутизації, використовуючи IP-адреси, а не розв'язуючи імена хостів ( netstat -rn),
шукає шлюз за замовчуванням (рядки, що починаються з 0.0.0.0або default),
і друкує хост шлюзу (друге поле результатів).

Поширення \символів у регулярному виразі значне:

  • \(і \)вказати групу
  • \| - символ чергування (річ зліва або річ праворуч збігається)
  • крапки в IP-адресі представлені \.- означає буквальний символ .на відміну від регулярного виразу .(відповідає будь-якому одному символу)

1
grep -eабо egrepтакож зробить трюк, не потребуючи дужок і труби, щоб уникнутиegrep '^(default|0\.0\.0\.0)'
Марк К Коуан

1

Ось як я це роблю:

#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*/\1/p")
echo ${GATEWAY_DEFAULT}

1
 ip route show default | grep default | awk {'print $3'}

Тут це робиться


Чому, grep defaultколи ви вже вказуєте defaultмаршрут у своїй ipкоманді?
lindhe

0

ДУЖЕ простий спосіб ... запитайте таблицю маршрутизації, як вона потрапляє до IP за межами своєї мережі

Google DNS == 8.8.8.8

ip маршрут отримати 8.8.8.8


0
ip route show 0/0

або

ip route show 0.0.0.0/0

або

ip route show 0.0.0.0/0.0.0.0

або

ip -f inet route show default

або

ip -4 route show default

Якщо я правильно це розумію, пошук шлюзу за замовчуванням для цього точного маршруту - маршрут з усіма нулями - або 0,0.0.0/0.0.0.0 (або 0/0) для IPv4 або 0000: 0000: 0000: 0000: 0000: 0000 : 0000: 0000 (або: :) для IPv6.

Однак (!), Не вказуючи AF, який ви бажаєте використовувати (-4 або -6 або -f inet або -f inet6), або не задаючи маршрут нулі як префікс IPv4 або IPv6 (0/0 означає IPv4) , він не може з'ясувати, що таке "за замовчуванням" ...

Особисто я не вважаю, що сторінка man дуже зрозуміла щодо цього, але це лише два мої центи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.