Подтвердить что ты не робот

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

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

Я использовал эту команду: netstat -rn | grep 0.0.0.0

И он вернул этот список:

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

Моя цель здесь - выполнить ping по умолчанию шлюз с помощью пункта назначения 0.0.0.0; таким образом, это 133.88.31.70; но этот возвращает список из-за использования grep.

Как мне получить только шлюз по умолчанию? Мне понадобится это для моего bash script, чтобы определить, подключено ли сетевое соединение или нет.

4b9b3361

Ответ 1

Вы можете получить шлюз по умолчанию с помощью команды ip следующим образом:

IP=$(/sbin/ip route | awk '/default/ { print $3 }')
echo $IP

Ответ 2

Команда ip route из пакета iproute2 может выбирать маршруты без использования awk/grep и т.д., чтобы сделать выбор.

Чтобы выбрать маршрут по умолчанию (возможно, много)

$ ip -4 route list 0/0   # use -6 instead of -4 for ipv6 selection.
default via 172.28.206.254 dev wlan0  proto static

Чтобы выбрать следующий скачок для определенного интерфейса

$ ip -4 route list type unicast dev eth0 exact 0/0  # Exact specificity
default via 172.29.19.1 dev eth0

В случае нескольких шлюзов по умолчанию вы можете выбрать, какой из них выбирается в качестве следующего перехода к определенному адресу назначения.

$ ip route get $(dig +short google.com | tail -1)
173.194.34.134 via 172.28.206.254 dev wlan0  src 172.28.206.66 
    cache

Затем вы можете извлечь значение с помощью sed/awk/grep и т.д. Вот один пример, используя bash read builtin.

$ read _ _ gateway _ < <(ip route list match 0/0); echo "$gateway"
172.28.206.254

Ответ 3

работает на любом Linux:

route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " "

Ответ 4

Этот простой perl script сделает это за вас.

#!/usr/bin/perl

$ns = `netstat -nr`;

$ns =~ m/0.0.0.0\s+([0-9]+.[0-9]+.[0-9]+.[0-9]+)/g;

print $1

В принципе, мы запускаем netstat, сохраняем его до $ns. Затем найдите строку, начинающуюся с 0.0.0.0. Затем круглые скобки в регулярном выражении сохраняют все внутри него в 1 доллар. После этого просто распечатайте его.

Если он был вызван null -gw.pl, просто запустите его в команде, например:

perl null-gw.pl

или если вам нужно это внутри выражения bash:

echo $(perl null-gw.pl)

Удачи.

Ответ 5

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

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

Ответ 6

Еще одна вещь:

$return = (split(" ", `ip route | grep default`))[2];<br>

Примечание: используйте эти обратные элементы перед ip и после default

Ответ 7

netstat -rn | grep 0.0.0.0 | awk '{print $2}' | grep -v "0.0.0.0"

Ответ 8

#!/bin/bash

##################################################################3
# Alex Lucard
# June 13 2013
#
# Get the gateway IP address from the router and store it in the variable $gatewayIP
# Get the Router mac address and store it in the variable gatewayRouter
# Store your routers mac address in the variable homeRouterMacAddress
#

# If you need the gateway IP uncomment the next line to get the gateway address and store it in the variable gateWayIP
# gatewayIP=`sudo route -n | awk '/^0.0.0.0/ {print $2}'` 

homeRouterMacAddress="20:aa:4b:8d:cb:7e" # Store my home routers mac address in homeRouterMac.
gatewayRouter=`/usr/sbin/arp -a`

# This if statement will search your gateway router for the mac address you have in the variable homeRouterMacAddress
if `echo ${gatewayRouter} | grep "${homeRouterMacAddress}" 1>/dev/null 2>&1`
then
  echo "You are home"
else
  echo "You are away"
fi

Ответ 9

Здесь уже много ответов. Некоторые из них довольно специфичны для дистрибутива. Для тех, кто нашел это сообщение, ищет способ найти шлюз, но не нужно его использовать при использовании кода/партии (как и я)... try:

traceroute www.google.com

первым хостом является ваш шлюз по умолчанию.

Ответ 10

Если вы знаете, что 0.0.0.0 - ваш ожидаемый результат и будет в начале строки, вы можете использовать следующее в script:

IP=`netstat -rn | grep -e '^0\.0\.0\.0' | cut -d' ' -f2`

то ссылайтесь на переменную ${IP}.

Лучше использовать awk вместо вырезания здесь... i.e.:

IP=`netstat -rn | grep -e '^0\.0\.0\.0' | awk '{print $2}'`

Ответ 11

используйте команду ниже:

route -n | grep '^0\.0\.\0\.0[ \t]\+[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*[ \t]\+0\.0\.0\.0[ \t]\+[^ \t]*G[^ \t]*[ \t]' | awk '{print $2}'

Ответ 12

/sbin/route | egrep "^ default" | cut -d '' -f2-12 # и 'cut' по вкусу...

Ответ 13

Для списка стандартных шлюзов all используйте mezgani answer, дублированный (и немного упрощенный) здесь:

/sbin/ip route | awk '/^default/ { print $3 }'

Если у вас одновременно установлено несколько сетевых интерфейсов, это приведет к печати нескольких шлюзов. Если вы хотите выбрать один известный сетевой интерфейс по имени (например, eth1), просто найдите его в дополнение к фильтрации для строк ^default:

/sbin/ip route |grep '^default' | awk '/eth1/ {print $3}'

Вы можете сделать script, который принимает одно имя сетевого интерфейса в качестве аргумента и печатает связанный шлюз:

#!/bin/bash
if [[ $# -ne 1 ]]; then
    echo "ERROR: must specify network interface name!" >&2
    exit 1
fi
# The third argument of the 'default' line associated with the specified
# network interface is the Gateway.
# By default, awk does not set the exit-code to a nonzero status if a
# specified search string is not found, so we must do so manually.
/sbin/ip route | grep '^default' | awk "/$1/ {print \$3; found=1} END{exit !found}"

Как отмечалось в комментариях, это имеет то преимущество, что устанавливается разумный код выхода, который может быть полезен в более широком программном контексте.