使用Tcl确定默认网关

时间:2015-01-31 20:53:26

标签: network-programming tcl tk

我有一个Tcl / Tk脚本,我需要找到它运行的计算机的默认网关来建立与路由器的连接。有没有办法(最好是跨平台)找出计算机的默认网关设置的内容?

我想,对于Linux(Ubuntu,特别是 - 我瞄准的平台),我可以称之为"路由"命令和解析,但我不确定它是否适用于Windows,并且我希望在可能的情况下尽可能避免进行系统调用。

1 个答案:

答案 0 :(得分: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"
}

底层代码不可移植,但您的代码可以。简单!