Назад | Перейти на главную страницу

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

Я пытаюсь получить шлюз по умолчанию, используя пункт назначения 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, чтобы определить, подключено ли сетевое соединение или нет.

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

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

 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 как параметр

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

Если вы хотите сделать это, используя netstat (так что он будет работать над тем, что НЕ Linux) общее решение:

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

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

Распространение \ символы в регулярном выражении имеют значение:

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

Вот как я это делаю:

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

Это здесь

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

Google DNS == 8.8.8.8

ip route получить 8.8.8.8

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) , он не может понять, что такое "по умолчанию" ...

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