Comment puis-je obtenir la passerelle par défaut dans LINUX étant donné la destination?

j'essaie d'obtenir la passerelle par défaut, en utilisant la destination 0.0.0.0

j'ai utilisé cette commande: netstat -rn | grep 0.0.0.0

Et il a renvoyé cette liste:

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

mon but ici est de ping la passerelle par défaut en utilisant destination 0.0.0.0; donc, c'est 133.88.31.70; mais celui-ci renvoie une liste en raison de l'aide de grep.

Comment puis-je obtenir la passerelle par défaut? J'en aurai besoin pour mon script bash pour identifier si net connection est en place ou non.

31
demandé sur Zsolt Botykai 2009-07-30 09:35:29

14 réponses

vous pouvez obtenir la passerelle par défaut en utilisant ip commande comme ceci:

IP=$(/sbin/ip route | awk '/default/ { print  }')
echo $IP
50
répondu Ali Mezgani 2013-11-13 05:50:10

ip route commande depuis le iproute2 paquet peut sélectionner des routes sans avoir besoin d'utiliser awk/grep, etc pour faire la sélection.

Pour sélectionner l'itinéraire par défaut (à partir de voire beaucoup)

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

Pour sélectionner le saut suivant pour une interface donnée

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

dans le cas de plusieurs passerelles par défaut, vous pouvez sélectionner celle qui sera choisie comme la prochaine-sauts vers une destination particulière adresse.

$ 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

vous pouvez alors extraire la valeur en utilisant sed/awk/grep, etc. Voici un exemple d'utilisation bashread builtin.

$ read _ _ gateway _ < <(ip route list match 0/0); echo "$gateway"
172.28.206.254
29
répondu shalomb 2016-06-27 16:35:55

fonctionne sur toutes les versions de linux:

route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " "
5
répondu damix 2014-02-23 12:57:24

ce simple script perl le fera pour vous.

#!/usr/bin/perl

$ns = `netstat -nr`;

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

print 

en gros, nous exécutons netstat, sauvez-le à $ns. Trouvez ensuite la ligne qui commence par 0.0.0.0. Puis les parenthèses dans le regex sauvegardent tout ce qu'il contient dans $1. Après cela, il suffit de l'imprimer.

si elle a été appelée null-gw.pl, il suffit de l'exécuter sur la commande comme:

perl null-gw.pl

ou si vous en avez besoin à l'intérieur d'un bash de l'expression:

echo $(perl null-gw.pl)

Bonne chance.

4
répondu Jeremy Powell 2009-07-30 06:00:07

C'est comment je le fais:

#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*//p")
echo ${GATEWAY_DEFAULT}
3
répondu Noah Spurrier 2012-07-23 23:50:08

un Autre perl chose:

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

Note: utilisez ces bas de page avant ip et après default

1
répondu somone 2012-01-31 20:20:51

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

1
répondu Linx 2013-01-08 05:36:10
#!/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 }'` 

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
1
répondu Alex Lucard 2013-06-14 04:38:40

il y a déjà beaucoup de réponses ici. Certaines sont assez spécifiques aux distros. Pour ceux qui ont trouvé ce post vous cherchez un moyen de trouver la porte d'entrée, mais ne pas avoir à l'utiliser dans le code/lot d'utilisation (comme je l'ai fait)... à essayer:

traceroute www.google.com

le premier saut est votre passerelle par défaut.

1
répondu blueflyingdago 2014-12-26 22:12:24

Pour une liste de les passerelles par défaut, utilisez réponse de mezgani, dupliqué (et légèrement simplifié) ici:

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

si vous avez plusieurs interfaces réseau configurées simultanément, cela imprimera plusieurs passerelles. Si vous souhaitez sélectionner une seule interface réseau connue par son nom (par exemple eth1), il suffit de chercher filtrage pour le ^default lignes:

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

Vous pouvez faire un script qui prend un seul nom d'interface réseau comme argument et imprime la passerelle associée:

#!/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 "// {print $3; found=1} END{exit !found}"

tel que noté dans les commentaires, cela a l'avantage d'établir un code de sortie raisonnable, qui peut être utile dans un contexte programmatique plus large.

1
répondu Kyle Strand 2017-05-23 11:54:26

Si vous savez que 0.0.0.0 est votre sortie attendue, et sera, au début de la ligne, vous pouvez utiliser les éléments suivants dans votre script:

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

puis référencez la variable ${IP}.

Il serait préférable d'utiliser awk au lieu de couper ici... i.e.:

IP=`netstat -rn | grep -e '^0\.0\.0\.0' | awk '{print }'`
0
répondu maxwellb 2012-01-31 20:19:32

utiliser la commande ci-dessous:

route -n | grep '^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 }'
0
répondu Jason 2012-02-08 04:51:38

/sbin/route |egrep "^par défaut" |cut-d' '-f2-12 #et "couper" au goût...

0
répondu Chuck 2013-02-01 18:08:35

la commande suivante renvoie L'adresse IP de la passerelle de route par défaut sur un hôte Linux utilisant seulement bash et awk:

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

Cela devrait même travail, si vous avez plus d'une passerelle par défaut, tant que leurs paramètres sont différents (et ils devraient être..).

0
répondu David Newhall II 2018-09-27 05:17:29