私は次のexpectスクリプトを持っています:
- ホストへのSSH
- 必要に応じてユーザーからのパスワードを受け入れる
- sshが成功したら(プロンプトが表示されます)、環境変数を設定します
- プロンプトに戻ったら、ネットワークテスト用のプログラムを実行します
- プロンプトに戻ったら、expectを終了し、sshセッションを閉じます
#!/usr/bin/expect
set hostname [lindex $argv 0]
set working_dir [lindex $argv 1]
set package [lindex $argv 2]
set tcl_test $working_dir/$package.tcl
set config $working_dir/$package.config
set logdir $working_dir/$package
set timeout 30
set prompt "\~\\\]\\\$"
eval spawn ssh $hostname
expect {
-re "(yes/no)" {send "yes\r"}
-re "password\:" {
interact {
-o
-re $prompt {send "export VARIABLE1=$working_dir\"\r"}
-re $prompt {send "issue-test-command -config $config -module $tcl_test\r"}
}
}
}
パスワードの一致と相互作用は正しく機能します。$ promptが一致するとすぐに、環境変数exportコマンドが発行されます。
-re $prompt {send "export VARIABLE1=$working_dir\"\r"}
これは正しいですが、次の行に進むのではなく、次のようにします。
-re $prompt {send "issue-test-command -config $config -module $tcl_test\r"}
同じ行が読み取られ、パターンが再度照合され、同じコマンドが実行されます。これにより、同じコマンドを発行する永続的なループが発生します。
インタラクションを強制して次の行に移動したり、別の期待値ビルトインを使用して目的を達成するにはどうすればよいですか?