2012-10-24 76 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