如何在给定目的地的情况下在LINUX中获取默认网关?


11

我正在尝试使用目标0.0.0.0获取默认网关

我使用了以下命令:netstat -rn | grep 0.0.0.0

它返回此列表:

Destination - Gateway      - Genmask         - Flags - MSS - Window - irtt - Iface
10.9.9.17   - 0.0.0.0      - 255.255.255.255 - UH    - 0     0        0    - tun0
133.88.0.0  - 0.0.0.0      - 255.255.0.0     - U     - 0     0        0    - eth0
0.0.0.0     - 133.88.31.70 - 0.0.0.0         - UG    - 0     0        0    - eth0

我的目标是使用目标0.0.0.0 ping默认网关。因此,即为“ 133.88.31.70”;但这是因为使用了'grep'而返回了一个列表。

问题是:如何仅获取默认网关?对于我的bash脚本,我将需要它来识别网络连接是否建立。

Answers:


21
DEFAULT_ROUTE=$(ip route show default | awk '/default/ {print $3}')
ping -c 1 $DEFAULT_ROUTE

这应该可以解决您的问题。


@苏茜哈!看到?糟糕!
杰里米·鲍威尔

我认为最后的单引号/右括号不匹配-否则效果很好!
Mark K Cowan

3
我已经在网上看到了很多与此命令有关的答案,但是没有一个解释为什么使用“显示默认值”。实际上,没有任何参数的“ ip route show”对我来说完全一样。所以我的问题是,为什么命令中包含“默认”?这是什么意思?
user658991

@ user658991我去过这个兔子洞,你说的很对。在最常见的版本上它什么ip。实际上,它ip route show是的别名ip route list,您可以检查man ip该子命令是否具有语法ip route { list | flush } SELECTOR...并且列出的所有有效选择器中没有一个是default。我觉得ip route show table default 应该做我们想要的,但是不幸的是,它没有做。对于其他人,也要匹配该行的开头(您已经被警告过):ip route show | awk '/^default/{print $3}'
L0j1k

5
 ip route show default 0.0.0.0/0

该命令比ip route | grep带有许多(10000+)路由的系统上的默认命令快得多

例如,从具有完整BGP和手动默认路由作为备份的路由器中查找

router:~# time ip route show default 0.0.0.0/0
default via XXX.XXX.192.254 dev eth0.123 

real    0m0.707s
router:~# time ip route | grep default
default via XXX.XXX.192.254 dev eth0.123 

real    0m8.596s
  • 因为ip route show default show对我来说,所有路线不仅是默认路线
  • 因为ip route get不接受默认值0.0.0.0/0作为参数

+1用于演示通过iproute2直接进行本机过滤!有这么多的情况下,这个惊人的工具套件比(公认的创意)传统的Linux textfu更准确,可靠,高性能和
RubyTuesdayDONO

1
这是一个很好的答案!但是我仍然对iproute2的文档感到困惑。命令中的“默认”表示什么?如果我正确阅读了文档,此命令应与“ ip route show to default 0/0”相同,对吗?什么是“ 0/0”格式?
user658991

3

ip route show default应该使用默认网关的技巧,或者您可以ip route get <someip>用来查看特定IP地址的路由。


我尝试了ip route,它显示了所有网关的列表..是的,默认名称也显示在底部。感谢那。=)但我的目标是获取用于该默认网关的IP地址。使用bash脚本,我将ping该脚本以检查其启动与否。
Suezy

我有四个“显示默认值”条目。“ ip route show default | awk'/ default / {print $ 3}'”应该可以单独获取IP地址。
大卫·帕什利

2

如果要使用netstat它(这样可以在非Linux上运行),则一般的解决方案是:

netstat -rn | grep '^\(default\|0\.0\.0\.0\)' | awk '{print $2}'

这将显示使用IP而不是解析主机名(netstat -rn)的路由表,
查找默认网关(以0.0.0.0或开头的行default),
并打印网关主机(结果的第二个字段)。

\正则表达式中字符的扩散非常重要:

  • \(\)指定一个组
  • \| 是交替字符(左边的事物或右边的事物匹配)
  • IP地址中的点用\.-表示与.正则表达式相反的文字字符.(匹配任何单个字符)

1
grep -e还是egrep无需托架和管子就可以逃脱egrep '^(default|0\.0\.0\.0)'
Mark K Cowan 2013年

1

这是我的方法:

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

1
 ip route show default | grep default | awk {'print $3'}

在这里吗


为什么grep default已经defaultip命令中指定了路由?
lindhe

0

非常简单的方法...询问路由表如何到达其网络之外的IP

Google DNS == 8.8.8.8

IP路由获得8.8.8.8


0
ip route show 0/0

要么

ip route show 0.0.0.0/0

要么

ip route show 0.0.0.0/0.0.0.0

要么

ip -f inet route show default

要么

ip -4 route show default

如果我正确理解,则该确切路由(全零路由)的默认网关查找是IPv4的0.0.0.0/0.0.0.0(或0/0),或者是0000:0000:0000:0000:0000:0000 IPv6的:0000:0000(或::)。

但是(!),没有指定要使用的AF(-4或-6或-f inet或-f inet6),也没有将全零路由指定为IPv4或IPv6前缀(0/0表示IPv4) ,它无法弄清楚“默认”是什么...

就个人而言,我认为手册页对此并不十分清楚,但这只是我的两分钱。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.