2015-11-17 138 views
1

我正在使用tcl腳本來打開與Linux機器的ssh連接並打開虛擬交換機應用程序。在交換機CLI內部,我添加> 1000個IP路由。tcl腳本運行不正常

我運行腳本爲= ./script_name.tcl而不是通過tclsh,因爲這往往會給我一些錯誤。

的問題是在某處怎麼TCL解釋,而TCL腳本中循環。 我while循環 -

sleep 1 

set i 1 
while {$i < 3 } { 
    set j 2 
    expect "*#" 
    while {$j < 255} { 
     send "ip route 2.2.$i.$j 255.255.255.255 4.4.4.1\r" 
     incr j 
    } 
    incr i 
} 

sleep 1 
expect "*#" 

set k 1 
while {$k < 3 } { 
    set l 2 
    expect "*#" 
    while {$l < 255} { 
     send "ip route 1.1.$k.$l 255.255.255.255 1.1.1.5\r" 
     incr l 
    } 
    incr k 
} 

我用2,而用於新增500〜路線,因此總應> 1000個路由環路。問題是隻有〜500條路線被添加,下一個while循環不起作用。下一個while循環顯示爲在CLI中工作,但實際上不添加路由。

但是,如果我用while循環添加1000條路線。我將{$i < 3 }的while循環計數器更改爲{$i < 5 },它可以工作。

不知怎的,第二個循環沒有得到正確執行。

+0

更新:腳本中的執行順序非常奇怪。如果我在while循環後面加上'puts「語句」'。這些語句首先被打印 - 循環之後運行。是否有一些定義的tcl腳本運行順序的行爲? – tcpip

+0

你不顯示你的'#!'行,但你必須用'expect'運行您的程序,或者用'tclsh'並添加行'包需要Expect'(用大寫E) –

回答

2

使用*#可能有點棘手,因爲它可能匹配零次發生爲好。取而代之的是,我們可以定義(即使用$

sleep 1 
set prompt "#(\\s+)?\$" 
set i 1 
while {$i < 3 } { 
    set j 2 
    while {$j < 255} { 
     send "ip route 2.2.$i.$j 255.255.255.255 4.4.4.1\r" 
     expect -re $prompt 
     incr j 
    } 
    incr i 
} 

sleep 1 

set k 1 
while {$k < 3 } { 
    set l 2 
    while {$l < 255} { 
     send "ip route 1.1.$k.$l 255.255.255.255 1.1.1.5\r" 
     expect -re $prompt 
     incr l 
    } 
    incr k 
} 

這應該適用於該提示正則表達式將匹配到行的末尾。如果不是,請添加exp_internal 1並檢查調試信息。順便說一下,不要保留不必要的expect聲明,它將根據timeout值做任何事情,只會延遲執行。

爲正則表達式如下的說明中,

enter image description here

+0

@tcpip,記Dinesh也提出了「期望」表述。 –

+0

@Dinesh:您的解決方案顯着改善了腳本的性能。我觀察到個別路線越來越不像以前在一組6-7路線中的「爆炸樣」添加路線。 然而,約500條路線逃跑加法的問題是不同的,也是一個愚蠢的問題。我在第二個環路ip route 1.1。$ k。$ l 255.255.255.255 1.1.1.5'中添加的路由具有相同的目的地址和網關IP,這些IP根據內部邏輯失敗。 – tcpip

+1

@tcpip:所以,從技術上講,我的答案至少對性能有幫助。 – Dinesh

0

我杵兩個環中一個,並且還改變了目的地IP中的路由中的一個命令,其中先前的目標和網關IP是重疊 - 1.1.$k.$l 255.255.255.255 1.1.1.5

set prompt "#(\\s+)?\$" 
set i 1 
while {$i < 3 } { 
    set j 2 
    while {$j < 255} { 
     send "ip route 2.2.$i.$j 255.255.255.255 4.4.4.1\r" 
     send "ip route 3.3.$i.$j 255.255.255.255 1.1.1.5\r" 
     expect -re $prompt 
     incr j 
    } 
    incr i 
}