【发布时间】:2015-02-01 07:17:48
【问题描述】:
我有一个 Tcl/Tk 脚本,我需要找到运行它的计算机的默认网关来建立到路由器的连接。有什么方法(最好是跨平台的)来找出计算机的默认网关设置为什么?
我想对于 Linux(特别是 Ubuntu,我的目标平台)我可以调用“路由”命令并对其进行解析,但我不确定它是否可以在 Windows 上运行,我希望原则上尽可能避免进行系统调用。
【问题讨论】:
标签: network-programming tcl tk
我有一个 Tcl/Tk 脚本,我需要找到运行它的计算机的默认网关来建立到路由器的连接。有什么方法(最好是跨平台的)来找出计算机的默认网关设置为什么?
我想对于 Linux(特别是 Ubuntu,我的目标平台)我可以调用“路由”命令并对其进行解析,但我不确定它是否可以在 Windows 上运行,我希望原则上尽可能避免进行系统调用。
【问题讨论】:
标签: network-programming tcl tk
获取网络路由信息的方法是询问操作系统。这也是一个不太跨平台的操作。在 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"
}
底层代码不可移植,但您的代码可以。简单!
【讨论】: