如何在目的地的LINUX中获得默认网关?

Sue*_*ezy 34 shell gateway

我正在尝试使用目标获取默认网关 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>
Run Code Online (Sandbox Code Playgroud)

我的目标是使用目标ping默认网关0.0.0.0; 因此,那是133.88.31.70; 但是这个因为使用而返回一个列表grep.

我如何只获得默认网关?我将需要它用于我的bash脚本来识别网络连接是否正常.

Ali*_*ani 54

您可以使用以下ip命令获取默认网关:

IP=$(/sbin/ip route | awk '/default/ { print $3 }')
echo $IP
Run Code Online (Sandbox Code Playgroud)

  • 如果有多个默认网关怎么办?你的脚本产生了我的`192.168.1.1 192.168.0.1`,这是真的:我有两个互联网网关.但主要的是`192.168.1.1`.是否应该选择第一个`default`值作为主(默认)值? (4认同)

sha*_*omb 37

iproute2包中的ip route命令可以选择路由而无需使用/ 等进行选择.awkgrep

选择默认路由(可能很多)

$ ip -4 route list 0/0   # use -6 instead of -4 for ipv6 selection.
default via 172.28.206.254 dev wlan0  proto static
Run Code Online (Sandbox Code Playgroud)

选择特定接口的下一跳

$ ip -4 route list type unicast dev eth0 exact 0/0  # Exact specificity
default via 172.29.19.1 dev eth0
Run Code Online (Sandbox Code Playgroud)

在多个默认网关的情况下,您可以选择将哪一个选择为特定目标地址的下一跳.

$ 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
Run Code Online (Sandbox Code Playgroud)

然后,可以使用提取的值sed/ awk/ grep等以下是使用一个例子中bashread内建.

$ read _ _ gateway _ < <(ip route list match 0/0); echo "$gateway"
172.28.206.254
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,因为ip已经输出了正确的行.基于此的略微改进的版本是:`ip -4 route list 0/0 | 切-d'' - f 3` (11认同)
  • 更紧凑的是`ip rl 0/0 | 剪切 -f3 -d' '` (2认同)

小智 6

适用于任何Linux:

route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " "
Run Code Online (Sandbox Code Playgroud)

  • `route -n | awk'$ 4 ==“ UG” {print $ 2}'`,使用相同的想法,但hacky少 (2认同)

Jer*_*ell 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
Run Code Online (Sandbox Code Playgroud)

基本上,我们运行 netstat,将其保存到 $ns。然后找到以 0.0.0.0 开头的行。然后正则表达式中的括号将其中的所有内容保存到 $1 中。之后,只需打印出来即可。

如果它被称为 null-gw.pl,只需在命令上运行它,例如:

perl null-gw.pl
Run Code Online (Sandbox Code Playgroud)

或者如果您需要在 bash 表达式中使用它:

echo $(perl null-gw.pl)
Run Code Online (Sandbox Code Playgroud)

祝你好运。