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.
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
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
fonctionne sur n'importe quel linux:
route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " "
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.
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}
Une autre chose Perl:
$return = (split(" ", `ip route | grep default`))[2];<br>
Note: utiliser ces backticks avant ip
et après default
netstat -rn | grep 0.0.0.0 | awk '{print $ 2}' | grep -v "0.0.0.0"
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.
#!/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
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.
/ sbin/route | egrep "^ default" | cut -d '' -f2-12 #et 'couper' au goût ...
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}'`
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}'
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 ...).