2013-09-28 37 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