Ответ 1
Вы можете получить шлюз по умолчанию с помощью команды ip
следующим образом:
IP=$(/sbin/ip route | awk '/default/ { print $3 }')
echo $IP
Я пытаюсь получить шлюз по умолчанию, используя пункт назначения 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, чтобы определить, подключено ли сетевое соединение или нет.
Вы можете получить шлюз по умолчанию с помощью команды ip
следующим образом:
IP=$(/sbin/ip route | awk '/default/ { print $3 }')
echo $IP
Команда 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
работает на любом Linux:
route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " "
Этот простой 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)
Удачи.
Вот как я это делаю:
#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*/\1/p")
echo ${GATEWAY_DEFAULT}
Еще одна вещь:
$return = (split(" ", `ip route | grep default`))[2];<br>
Примечание: используйте эти обратные элементы перед ip
и после default
netstat -rn | grep 0.0.0.0 | awk '{print $2}' | grep -v "0.0.0.0"
#!/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
Здесь уже много ответов. Некоторые из них довольно специфичны для дистрибутива. Для тех, кто нашел это сообщение, ищет способ найти шлюз, но не нужно его использовать при использовании кода/партии (как и я)... try:
traceroute www.google.com
первым хостом является ваш шлюз по умолчанию.
Если вы знаете, что 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}'`
используйте команду ниже:
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}'
/sbin/route | egrep "^ default" | cut -d '' -f2-12 # и 'cut' по вкусу...
Для списка стандартных шлюзов 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}"
Как отмечалось в комментариях, это имеет то преимущество, что устанавливается разумный код выхода, который может быть полезен в более широком программном контексте.