使用Expect无法正常工作的密码提示

时间:2016-09-09 10:50:31

标签: regex passwords tcl expect

我需要接受键盘上的密码,该密码包含至少一个数字,至少一个大写字母,至少一个小写字母和可选符号#& - 我写了下面的代码。它总是超时,但没有检测到密码......任何人都可以帮忙

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也没有检测到它,并且正在进行下一次尝试并最终超时

1 个答案:

答案 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命令说“继续期待;我们还没有完成“而且至关重要处理复杂的互动。此外,我已在该行末尾锚定了匹配项,并添加了( ... ),以便更轻松地提取密码。