【问题标题】:Determining default gateway with Tcl使用 Tcl 确定默认网关
【发布时间】:2015-02-01 07:17:48
【问题描述】:

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

我想对于 Linux(特别是 Ubuntu,我的目标平台)我可以调用“路由”命令并对其进行解析,但我不确定它是否可以在 Windows 上运行,我希望原则上尽可能避免进行系统调用。

【问题讨论】:

    标签: network-programming tcl tk


    【解决方案1】:

    获取网络路由信息的方法询问操作系统。这也是一个不太跨平台的操作。在 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"
    }
    

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

    【讨论】:

    • 相当优雅的答案;我喜欢。现在投票,在我立即接受之前,我会等着看是否有其他人提出了一些令人兴奋的事情(我的一个抱怨是它确实会进行系统/执行调用,我不喜欢):)
    猜你喜欢
    • 2011-01-18
    • 2023-04-07
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多