2015-01-31 84 views
0

我有一個Tcl/Tk腳本,我需要找到正在運行的計算機的默認網關來建立到路由器的連接。有沒有什麼方法(最好是跨平臺的)來找出計算機的默認網關設置爲?我可以想象,對於Linux(Ubuntu,特別是我所針對的平臺),我可以調用「route」命令並解析它,但我不確定這可以在Windows上工作,而且我會原則上儘量避免在可能的情況下進行系統調用。用Tcl確定默認網關

回答

3

獲取有關網絡路由信息的方法是詢問操作系統。這也是一種不太跨平臺的操作。在Windows上,最簡單的方法是解析ipconfig /all的輸出。

set output [exec {*}[auto_execok ipconfig] /all] 
if {[regexp -line {Default Gateway[ .]*: (.+)} $output -> gw]} { 
    puts "The default gateway is $gw" 
} else { 
    puts "No default gateway found" 
} 

在Linux上,你需要這樣做:

# Note, might not be on your PATH by default 
set output [exec /sbin/route -n] 
if {[regexp -line {^0\.0\.0\.0\s+([0-9.]+)} $output -> gw]} { 
    puts "The default gateway is $gw" 
} else { 
    puts "No default gateway found" 
} 

在OSX(和其它BSD衍生工具),你需要一個不同的咒語:

set output [exec /sbin/route -n get 0.0.0.0] 
if {[regexp -line {gateway: ([0-9.]+)} $output -> gw]} { 
    puts "The default gateway is $gw" 
} else { 
    puts "No default gateway found" 
} 

正如你所看到的,這是令人沮喪的困難!讓我們用一個使用tcl_platform來決定做什麼的過程來結束它。現在

proc gateway {varName} { 
    upvar 1 $varName gw 
    global tcl_platform 
    if {$tcl_platform(platform) eq "windows"} { 
     set output [exec {*}[auto_execok ipconfig] /all] 
     set RE {Default Gateway[ .]*: (.+)} 
    } elseif {$tcl_platform(os) eq "Linux"} { 
     set output [exec /sbin/route -n] 
     set RE {^0\.0\.0\.0\s+([0-9.]+)} 
    } else { 
     # Assume we're OSX or BSD 
     set output [exec /sbin/route -n get 0.0.0.0] 
     set RE {gateway: ([0-9.]+)} 
    } 
    return [regexp -line $RE $output -> gw] 
} 

你就可以做到這一點在所有平臺上:

if {[gateway gw]} { 
    puts "The default gateway is $gw" 
} else { 
    puts "No default gateway found" 
} 

底層代碼是不可移植的,但你的代碼就可以了。簡單!

+0

相當優雅的答案;我喜歡。現在進行調查,在我立即接受之前,我會等待看看是否有其他人在做某些事情的時候會出現一些令人頭疼的事情(我的一個抱怨是它確實會發出系統/執行調用,我不喜歡):) – 2015-01-31 23:30:43