How do i get the default gateway in LINUX given the destination?

喜你入骨 提交于 2019-11-27 20:07:25

问题


I'm trying to get the default gateway, using the destination 0.0.0.0

I used this command: netstat -rn | grep 0.0.0.0

And it returned this list:

**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>

My goal here is to ping the default gateway using destination 0.0.0.0; thus, that is 133.88.31.70; but this one returns a list because of using grep.

How do i get the default gateway only? I will need it for my bash script to identify if net connection is up or not.


回答1:


You can get the default gateway using ip command like this:

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



回答2:


The ip route command from the iproute2 package can select routes without needing to use awk/grep, etc to do the selection.

To select the default route (from possibly many)

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

To select the next hop for a particular interface

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

In the case of multiple default gateways, you can select which one gets chosen as the next-hop to a particular destination address.

$ 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

You can then extract the value using sed/awk/grep, etc. Here is one example using bash's read builtin.

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



回答3:


works on any linux:

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



回答4:


This simple perl script will do it for you.

#!/usr/bin/perl

$ns = `netstat -nr`;

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

print $1

Basically, we run netstat, save it to $ns. Then find the line that starts off with 0.0.0.0. Then the parentheses in the regex saves everything inside it into $1. After that, simply print it out.

If it was called null-gw.pl, just run it on the command like:

perl null-gw.pl

or if you need it inside a bash expression:

echo $(perl null-gw.pl)

Good luck.




回答5:


This is how I do it:

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



回答6:


Another perl thing:

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

Note: use these backticks before ip and after 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:


There are a lot of answers here already. Some of these are pretty distro specific. For those who found this post looking for a way to find the gateway, but not needing to use it in code/batch utilization (as I did)... try:

traceroute www.google.com

the first hop is your default gateway.




回答10:


For a list of all default gateways, use mezgani's answer, duplicated (and slightly simplified) here:

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

If you have multiple network interfaces configured simultaneously, this will print multiple gateways. If you want to select a single known network interface by name (e.g. eth1), simply search for that in addition to filtering for the ^default lines:

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

You can make a script that takes a single network-interface name as an argument and prints the associated gateway:

#!/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}"

As noted in the comments, this has the advantage of setting a sensible exit-code, which may be useful in a broader programmatic context.




回答11:


If you know that 0.0.0.0 is your expected output, and will be at the beginning of the line, you could use the following in your script:

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

then reference the variable ${IP}.

It would be better to use awk instead of cut here... i.e.:

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



回答12:


use command below:

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



回答13:


/sbin/route |egrep "^default" |cut -d' ' -f2-12 #and 'cut' to taste...




回答14:


The following command returns the default route gateway IP on a Linux host using only bash and awk:

printf "%d.%d.%d.%d" $(awk '$2 == 00000000 && $7 == 00000000 { for (i = 8; i >= 2; i=i-2) { print "0x" substr($3, i-1, 2) } }' /proc/net/route)

This should even work if you have more than one default gateway as long as their metrics are different (and they should be..).



来源:https://stackoverflow.com/questions/1204629/how-do-i-get-the-default-gateway-in-linux-given-the-destination

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!