我需要接受键盘上的密码,该密码包含至少一个数字,至少一个大写字母,至少一个小写字母和可选符号#& - 我写了下面的代码。它总是超时,但没有检测到密码......任何人都可以帮忙
package require Expect
log_user 0
send "Enter Password\n"
expect {
-re {(?=.*?[0-9])(?=.*?[a-z])(?=.*?[A-Z])[a-zA-Z0-9#&-]*} {send "Password ok"}
timeout { send "Time out" }
}
我编辑了代码,现在只有在第一次尝试时以正确的格式给出密码才能正常工作...如果在第一次尝试中给出了错误的格式,则期望等待下一次尝试。但即使下一个条目是正确的,Expect也没有检测到它,并且正在进行下一次尝试并最终超时
答案 0 :(得分:0)
您需要另一条规则来匹配不可接受的密码(即,在换行符中以不与其他规则匹配的任何内容),打印邮件,然后再次开始等待。关键是exp_continue
。
send "Enter Password\n"
expect {
-re {(?=.*?[0-9])(?=.*?[a-z])(?=.*?[A-Z])([a-zA-Z0-9#&-]*)[\r\n]+} {
send "Password ok"
# Save the password for later...
set thePassword $expect_out(1,string)
}
-re {[\r\n]+} {
send "That looks like a bad password. Try again please.\n"
exp_continue
}
timeout {
send "Time out"
}
}
exp_continue
命令说“继续期待;我们还没有完成“而且至关重要处理复杂的互动。此外,我已在该行末尾锚定了匹配项,并添加了(
... )
,以便更轻松地提取密码。