我正在尝试使用目标0.0.0.0
我使用了这个命令:netstat -rn | grep 0.0.0.0
它返回了这个列表:
**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>
我的目标是使用目标0.0.0.0
ping默认网关;
因此,那是133.88.31.70
;但是这个因为使用grep
而返回一个列表。
我如何才获得默认网关?我将需要它来为我的bash脚本确定网络连接是否正常。
答案 0 :(得分:52)
您可以使用ip
命令获取默认网关,如下所示:
IP=$(/sbin/ip route | awk '/default/ { print $3 }')
echo $IP
答案 1 :(得分:36)
ip route
包中的iproute2命令可以选择路由,而无需使用awk
/ grep
等进行选择。
选择默认路线(可能很多)
$ ip -4 route list 0/0 # use -6 instead of -4 for ipv6 selection.
default via 172.28.206.254 dev wlan0 proto static
选择特定接口的下一跳
$ ip -4 route list type unicast dev eth0 exact 0/0 # Exact specificity
default via 172.29.19.1 dev eth0
如果是多个默认网关,您可以选择选择哪一个作为特定目标地址的下一跳。
$ 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
然后,您可以使用sed
/ awk
/ grep
等提取值。以下是使用bash
&#39; s read
的示例内置
$ read _ _ gateway _ < <(ip route list match 0/0); echo "$gateway"
172.28.206.254
答案 2 :(得分:6)
适用于任何linux:
route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " "
答案 3 :(得分:4)
这个简单的perl脚本将为您完成。
#!/usr/bin/perl
$ns = `netstat -nr`;
$ns =~ m/0.0.0.0\s+([0-9]+.[0-9]+.[0-9]+.[0-9]+)/g;
print $1
基本上,我们运行netstat,将其保存到$ ns。然后找到以0.0.0.0开头的行。然后正则表达式中的括号将其中的所有内容保存到$ 1中。之后,只需将其打印出来。
如果它被称为null-gw.pl,只需在命令如:
上运行它perl null-gw.pl
或者如果你需要在bash表达式中使用它:
echo $(perl null-gw.pl)
祝你好运。
答案 4 :(得分:3)
我就是这样做的:
#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*/\1/p")
echo ${GATEWAY_DEFAULT}
答案 5 :(得分:1)
另一件事:
$return = (split(" ", `ip route | grep default`))[2];<br>
注意:在ip
之前和default
答案 6 :(得分:1)
netstat -rn | grep 0.0.0.0 | awk'{print $ 2}'| grep -v“0.0.0.0”
答案 7 :(得分:1)
#!/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
答案 8 :(得分:1)
这里有很多答案。其中一些是非常特定的发行版。对于那些发现这篇文章的人寻找找到网关的方法,但不需要在代码/批处理中使用它(就像我一样)...尝试:
traceroute www.google.com
第一跳是您的默认网关。
答案 9 :(得分:1)
要获取所有默认网关的列表,请在此处使用mezgani's answer,重复(并略微简化):
/sbin/ip route | awk '/^default/ { print $3 }'
如果同时配置了多个网络接口,则会打印多个网关。如果您想按名称选择单个已知网络接口(例如eth1
),只需搜索以及^default
行的过滤
/sbin/ip route |grep '^default' | awk '/eth1/ {print $3}'
您可以创建一个脚本,该脚本将单个网络接口名称作为参数并打印关联的网关:
#!/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}"
正如评论中所指出的,这有利于设置合理的退出代码,这可能在更广泛的程序化环境中有用。
答案 10 :(得分:0)
如果您知道0.0.0.0
是您的预期输出,并且位于该行的开头,则可以在脚本中使用以下内容:
IP=`netstat -rn | grep -e '^0\.0\.0\.0' | cut -d' ' -f2`
然后引用变量${IP}
。
最好使用awk而不是在这里切割......即:
IP=`netstat -rn | grep -e '^0\.0\.0\.0' | awk '{print $2}'`
答案 11 :(得分:0)
使用以下命令:
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}'
答案 12 :(得分:0)
/ sbin / route | egrep“^ default”| cut -d'' - f2-12#和'cut'来品尝......
答案 13 :(得分:0)
以下命令仅使用bash和awk返回Linux主机上的默认路由网关IP:
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)
如果您具有多个默认网关,只要它们的度量标准不同(并且它们应该是..),这甚至应该可以工作。
答案 14 :(得分:0)
要获取作为默认网关的NIC名称,请使用以下命令:
netstat -rn | grep UG | awk '{print $8}'