2012-10-24 3 views
1

필자는 연결 테스트를 위해 여러 IP에 ssh 할 expect 스크립트를 작성하고 있습니다. 각 테스트의 결과를 스크립트를 호출하는 컴퓨터의 파일에 기록하는 "puts"문을 포함하고 싶습니다. puts가 파일에 쓰는 방법은 매뉴얼을 따르고 있다고 생각하지만, stdout에만 쓰는 것입니다. 아래 스크립트를 참조하십시오. 결과적으로 파일은 로컬 시스템에 작성되지만 출력은 로컬 시스템으로 보내지지 않습니다. 대신 출력은 표준 출력으로 이동합니다.puts가 파일에 쓸 것이라고 예상합니다.

#!/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, 그래서 기대하는 전체 스크립트를 변경했습니다. 이제 작동합니다.

#!/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