2015-01-31 4 views
0

У меня есть сценарий Tcl/Tk, и мне нужно найти шлюз по умолчанию для компьютера, на котором он запущен, для установления соединения с маршрутизатором. Есть ли способ (желательно кросс-платформенный), чтобы узнать, на что установлен шлюз по умолчанию для компьютера?Определение шлюза по умолчанию с Tcl

Я предполагаю, что для Linux (Ubuntu, в частности - платформа, на которую я нацелен) я мог бы вызвать команду «route» и проанализировать ее, но я не уверен, что это будет работать в Windows, и я бы например, чтобы избежать системных вызовов, если это возможно, в принципе.

ответ

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" 
} 

Основной код не является переносимым, но ваш код может быть. Легко!

+0

Довольно элегантный ответ; Мне нравится. Upvoting на данный момент, будет ждать, если кто-нибудь еще придет с чем-то мыслящим, прежде чем я немедленно приму (одна моя жалоба заключается в том, что он делает вызовы system/exec, которых я не люблю) :) –

Смежные вопросы