Как мне получить шлюз по умолчанию в LINUX, учитывая пункт назначения?


11

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

я использовал эту команду: netstat -rn | grep 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

Это должно решить вашу проблему.


@ Сьюзи Ха! Видеть? AWK!
Джереми Пауэлл

Я думаю, что закрытие одинарной / закрывающей скобки не подходит к концу, но работает отлично!
Марк К Коуэн

3
Я видел довольно много ответов онлайн с этой командой, но ни один из них не объясняет, почему используется «show default». На самом деле «ip route show» без каких-либо параметров делает для меня то же самое. Итак, мой вопрос, почему в команде есть «default»? Что это означает?
user658991

@ 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}'
L0j1k

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"?
user658991

3

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


Я попытался IP-маршрут, и он отображает список для всех шлюзов .. и да, по умолчанию также отображается в нижней части. Спасибо за это. =) Но моя цель здесь - получить IP-адрес, используемый для этого шлюза по умолчанию. Используя скрипт bash, я буду пинговать его, чтобы проверить, работает он или нет.
Сьюзи

Я получаю четыре записи для «шоу по умолчанию». "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команде?
Линд

0

ОЧЕНЬ простой способ ... спросить таблицу маршрутизации, как она попадает на IP вне своей сети

Google DNS == 8.8.8.8

ip route get 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
  • Версии, которые я тестировал, рассматривали 'ip route show' и 'ip route list' как эквиваленты (не в случае с 'ip route get')
  • Есть объяснение на https://bugzilla.kernel.org/show_bug.cgi?id=197899

Если я правильно понимаю, поиск шлюза по умолчанию для этого точного маршрута - маршрут со всеми нулями - это либо 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) , он не может понять, что такое «по умолчанию» ...

Лично я не чувствую, что страница справочника очень ясно говорит об этом, но это только мои два цента.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.