Я пытаюсь получить шлюз по умолчанию, используя пункт назначения 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
),
и печатает хост шлюза (второе поле результатов).
Распространение \
символы в регулярном выражении имеют значение:
\(
и \)
указать группу\|
это символ чередования (совпадение слева или справа)\.
- означает буквальный символ .
в отличие от регулярного выражения .
(соответствует любому одиночному символу)Вот как я это делаю:
#!/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
Если я правильно понимаю, поиск шлюза по умолчанию для этого точного маршрута - маршрут со всеми нулями - либо 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) , он не может понять, что такое "по умолчанию" ...
Лично я не чувствую, что справочная страница очень четко об этом говорит, но это всего лишь мои два цента.