2013-09-28 38 views
0

对于bash集成,我需要从接口中检索默认网关。查找网关的接口

这里是命令路径的输出-n

Table de routage IP du noyau 
Destination  Passerelle  Genmask   Indic Metric Ref Use Iface 
0.0.0.0   p.p.p.p   128.0.0.0  UG 0  0  0 tun0 
0.0.0.0   x.x.x.x   0.0.0.0   UG 100 0  0 eth0 
10.43.0.1  10.43.0.5  255.255.255.255 UGH 0  0  0 tun0 
10.43.0.5  0.0.0.0   255.255.255.255 UH 0  0  0 tun0 
y.y.y.y   x.x.x.x   255.255.255.255 UGH 0  0  0 eth0 
x.x.x.0   0.0.0.0   255.255.255.0 U  0  0  0 eth0 
128.0.0.0  10.43.0.5  128.0.0.0  UG 0  0  0 tun0 

我试图捕捉网关(PASSERELLE法文)为IFACE TUN0。

此正则表达式正在Rubular:

^[0\.]+\s+([\w\.]+)\s+.*UG.*tun0$ 

但这shell命令不起作用(无输出):

route -n |egrep -oh '^[0\.]+\s+([\w\.]+)\s+.*UG.*tun0$' 

请告诉我为什么?

+1

没有“接口的默认路由”这样的事情。默认路由是在内核路由表中的任何其他路由不能用于告知分组目的地时采用的路由。换句话说,对于所有接口,只能有一个[默认路由或网关](http://en.wikipedia.org/wiki/Default_gateway) – mvp

回答

1

尝试这样做(只有一个管):

route -n | 
    awk -viface=eth0 '{if ($1 == "0.0.0.0" && $8 == iface) {print $2;exit}}' 

,甚至更好:

ip route | 
    awk -viface=eth0 '{ 
     if ($1 == "default" && $2 == "via" && $5 == iface) {print $3; exit} 
    }' 
+0

完美工作,thx – Toilal

+0

在我的配置上,你的更好的解决方案不起作用,因为tun0接口是由OpenVPN创建的虚拟接口,并且没有“默认通过”路由。但在我看来,更好的解决方案是检索默认网关,而不指定任何接口。 – Toilal

+0

你现在有选择;) –

1

为什么不只是使用awk,而不是一个怪诞的正则表达式?喜欢的东西:

route -n | grep -e 'UG.*tun0' | awk '{print $2}' 

免责声明:我没有测试过这一点,所以有可能是一个错字...

+0

Thx,我找到了解决方案,我不知道awk的存在命令:) – Toilal

0

另一种选择,没有正则表达式和awk:

route -n | grep -E "ppp0$" | tr -s ' ' | cut -f 2 -d ' ' 
+0

'ppp0 $'是一个REGEX –

+0

@sputnick:没有正则表达式来分割我的意思。 'grep ppp0'也可以 – BeniBela