1

接続をテストするためにいくつかのIPにSSH接続するexpectスクリプトを書いています。スクリプトを呼び出すマシン上のファイルに各テストの結果を書き込むための「puts」ステートメントを含めたいと思います。putsがファイルに書き込むためのマニュアルに従っていると思いますが、それはstdoutにのみ書き込みます。以下のスクリプトを参照してください。最終的に、ファイルはローカルマシン上に作成されますが、出力はローカルマシンに送信されません。代わりに、出力はstdoutに送られます。

#!/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 $USER@$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
4

2 に答える 2

2

おそらく問題は、二重引用符を使用していたことです。$したがって、期待するために渡されるリテラルをエスケープする必要があります(つまり\$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 $USER@$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
于 2012-10-24T16:14:22.260 に答える
0

ええと、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 $USER@$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
于 2012-10-24T16:09:33.597 に答える