Способ получения информации о маршрутизации сети - это, чтобы спросить ОС. Это также операция, которая не очень кросс-платформенная. В 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"
}
Основной код не является переносимым, но ваш код может быть. Легко!
Довольно элегантный ответ; Мне нравится. Upvoting на данный момент, будет ждать, если кто-нибудь еще придет с чем-то мыслящим, прежде чем я немедленно приму (одна моя жалоба заключается в том, что он делает вызовы system/exec, которых я не люблю) :) –