2012-10-24 75 views
1

我正在編寫一個expect腳本,它將ssh轉換爲幾個IP來測試它們的連接。我想包含一個「puts」語句,將每個測試的結果寫入調用腳本的機器上的一個文件中。儘管我認爲我正在按照put來寫入文件的手冊,但它只寫入stdout。請參閱下面的腳本。最終的結果是該文件在本地機器上創建,但沒有輸出指向它。相反,輸出到stdout。expect將寫入文件

#!/bin/bash 

USER=user 
PASSWORD=password 
IPSTART=12.34.56. 
OUTFILE="TEST.log" 
PROMPT="#" 

for IPEND in `seq 200 231` 
do 

expect -c " 
     set timeout 3 
     set chan [open $OUTFILE w] 
     spawn ssh [email protected]$IPSTART$IPEND 
       expect -re \".*ssword.*\" {send \"$PASSWORD\n\"} 

       expect { 
         -re \".*Are you sure you want to continue connecting.*\" {send \"yes\n\"; exp_continue} 
         -re \".*$PROMPT.*\$.*\" {puts $chan \"$IPSTART$IPEND\n\"; send \"exit\n\"} 
       } 

     close $chan 
" 

done 

我想知道是否有引用的問題,但我無法弄清楚。

作爲參考,這是從http://www.tcl.tk/man/tcl8.4/TclCmd/puts.htm

set chan [open my.log a] 
set timestamp [clock format [clock seconds]] 
puts $chan "$timestamp - Hello, World!" 
close $chan 

回答

1

您可能會遇到的問題是您使用的是雙引號。因此,你應該逃避字面$,將傳遞給期望(即。\$chan):

#!/bin/bash 

USER=user 
PASSWORD=password 
IPSTART=12.34.56. 
OUTFILE="TEST.log" 
PROMPT="#" 

for IPEND in `seq 200 231` 
do 

expect -c " 
     set timeout 3 
     set chan [open $OUTFILE w] 
     spawn ssh [email protected]$IPSTART$IPEND 
       expect -re \".*ssword.*\" {send \"$PASSWORD\n\"} 

       expect { 
         -re \".*Are you sure you want to continue connecting.*\" {send \"yes\n\"; exp_continue} 
         -re \".*$PROMPT.*\$.*\" {puts \$chan \"$IPSTART$IPEND\n\"; send \"exit\n\"} 
       } 

     close $chan 
" 

done 
+0

這樣做!謝謝您的幫助 –

0

好例子,我coulnd't弄清楚如何做到這一點在bash,所以我改變了整個劇本的期望。它現在有效。

#!/bin/expect 

set USER "user" 
set PASSWORD "password" 
set IPSTART "12.34.56." 
set OUTFILE "TEST.log" 
set PROMPT "#" 
set CHAN [open $OUTFILE w] 

for {set IPEND 200} {$IPEND <= 231} {incr IPEND} { 
     spawn ssh [email protected]$IPSTART$IPEND 
       set timeout 3 
       expect { 
         -re ".*ssword.*" {send "$PASSWORD\n"} 
         timeout {puts $CHAN "$IPSTART$IPEND does not work"} 
       } 

       expect { 
         -re ".*Are you sure you want to continue connecting.*" {send "yes\n"; exp_continue} 
         -re ".*$PROMPT.*\$.*" {puts $CHAN "$IPSTART$IPEND works"; send "exit\n"} 
       } 
} 

close $CHAN