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.
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
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 bash
read
builtin.
$ read _ _ gateway _ < <(ip route list match 0/0); echo "$gateway"
172.28.206.254
fonctionne sur toutes les versions de 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
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.
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}
un Autre perl chose:
$return = (split(" ", `ip route | grep default`))[2];<br>
Note: utilisez ces bas de page avant ip
et après default
#!/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
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.
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.
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 }'`
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 }'
/sbin/route |egrep "^par défaut" |cut-d' '-f2-12 #et "couper" au goût...
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..).