如何将字符串作为可选项在期望脚本中等待它?

时间:2014-10-10 08:55:44

标签: linux bash expect

以下脚本适用于要求所有三个问题的案例,但有时Do you trust the above certificate [y|N] -->不会询问asadmin ...问题,因此expect失败。

问题

是否可以将Do you trust the above certificate [y|N] -->问题设为可选问题,以便在未询问此问题时expect脚本不会失败?

#!/usr/bin/expect

set password [lindex $argv 0]

spawn asadmin --user admin change-admin-password
expect "password"
send "\n"
expect "password"
send "$password\n"
expect "password"
send "$password\n"
expect "Do you trust the above certificate \[y\|N\] -->"
send "y\n"
expect eof
exit

1 个答案:

答案 0 :(得分:2)

set password [lindex $argv 0]

spawn asadmin --user admin change-admin-password

 # First time, when we see the password, we are simply typing 'return' key
expect "password"
send "\n"

expect { 
        "password"  { send "$password\n"; exp_continue }
        -ex "Do you trust the above certificate \[y|N] -->" {send "y\n";exp_continue}
        timeout { puts "Timeout happened." } 
        eof { exit }
 }

如您所见,exp_continue将帮助我们获得您所需的信息。

如果expect看到password,则会发送密码值。注意在那里使用exp_continue。 它会导致期望再次运行。因此,expect会看到密码两次,如果假设expect看到问题,则会发送'y\n'。如果它之前看到eof,则脚本将退出。

请注意,我已将第一个expect声明与密码分开保存在外面。原因只是我们发送的价值仅在第一次就不同了。

另请注意在expect语句中使用-ex标志,如下所示。

-ex "Do you trust the above certificate \[y|N] -->" {send "y\n";exp_continue}

它会使期望阻止任何类型的特殊模式匹配。仅仅逃离第一个方括号就足够了。