web-dev-qa-db-fra.com

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 le 0.0.0.0 de destination

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

Et il a retourné 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 objectif ici est d’envoyer une requête ping à la passerelle par défaut à l’aide de la destination 0.0.0.0; Ainsi, c’est 133.88.31.70; mais celui-ci retourne une liste à cause de l'utilisation de grep.

Comment puis-je obtenir la passerelle par défaut uniquement? J'en aurai besoin pour que mon script bash identifie si la connexion Internet est active ou non.

32
Suezy

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

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

La commande ip route du paquet iproute2 peut sélectionner des itinéraires sans avoir à utiliser awk/grep, etc. pour effectuer la sélection.

Pour sélectionner la route par défaut (parmi plusieurs possibles)

$ 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 particulière

$ 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 saut suivant pour une adresse de destination particulière.

$ 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 ensuite extraire la valeur à l'aide de la variable sed/awk/grep, etc. Voici un exemple d'utilisation de la variable bash de read.

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

fonctionne sur n'importe quel linux:

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

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 $1

En gros, nous courons netstat, enregistrez-le dans $ ns. Trouvez ensuite la ligne qui commence par 0.0.0.0. Ensuite, les parenthèses dans la regex sauvegardent tout ce qui est dedans dans $ 1. Après cela, imprimez-le simplement.

S'il s'appelait null-gw.pl, exécutez-le simplement avec la commande suivante:

Perl null-gw.pl

ou si vous en avez besoin dans une expression bash:

echo $(Perl null-gw.pl)

Bonne chance.

4
Jeremy Powell

Voici comment je le fais:

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

Une autre chose Perl:

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

Note: utiliser ces backticks avant ip et après default

1
somone

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

1
Linx

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

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

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 vous suffit de rechercher ce en plus de filtrage pour les lignes ^default:

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

Vous pouvez créer un script utilisant un seul nom d'interface réseau comme argument et imprimant 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 "/$1/ {print \$3; found=1} END{exit !found}"

Comme indiqué dans les commentaires, cela présente l'avantage de définir un code de sortie raisonnable, qui peut être utile dans un contexte programmatique plus large.

1
Kyle Strand
#!/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
1
Alex Lucard

Il y a déjà beaucoup de réponses ici. Certaines d'entre elles sont assez spécifiques à la distribution. Pour ceux qui ont trouvé ce post cherchant un moyen de trouver la passerelle, mais n'ayant pas besoin de l'utiliser dans l'utilisation de code/batch (comme je l'ai fait) ...

traceroute www.google.com

le premier saut est votre passerelle par défaut.

1
blueflyingdago

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

0
Chuck

Si vous savez que 0.0.0.0 correspond à votre sortie attendue et figurera 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 ... c’est-à-dire:

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

utilisez la commande ci-dessous:

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

La commande suivante retourne l'adresse IP de passerelle de route par défaut sur un hôte Linux en utilisant uniquement bash et 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)

Cela devrait même fonctionner si vous avez plus d'une passerelle par défaut tant que leurs métriques sont différentes (et elles devraient l'être ...).

0
David Newhall II