我有一个Tcl / Tk脚本,我需要找到它运行的计算机的默认网关来建立与路由器的连接。有没有办法(最好是跨平台)找出计算机的默认网关设置的内容?
我想,对于Linux(Ubuntu,特别是 - 我瞄准的平台),我可以称之为"路由"命令和解析,但我不确定它是否适用于Windows,并且我希望在可能的情况下尽可能避免进行系统调用。
答案 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"
}
底层代码不可移植,但您的代码可以。简单!