以下脚本适用于要求所有三个问题的案例,但有时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
答案 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}
它会使期望阻止任何类型的特殊模式匹配。仅仅逃离第一个方括号就足够了。