使用 Expect 的密码提示不起作用

Password prompt using Expect not working

我需要接受来自键盘的密码,其中至少包含一个数字、至少一个大写字母、至少一个小写字母和可选符号 # & - 我编写了以下代码。总是超时,就是检测不到密码...谁能帮忙

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 将等待下一次尝试。但即使下一个条目是正确的,Expect 也没有检测到它,并且会进行下一次尝试并最终超时

您需要另一条规则来匹配不可接受的密码(即任何以换行符结尾但不匹配另一条规则的密码),打印一条消息,然后重新开始等待。关键是 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命令说“继续期待;我们还没有完成”,这对于处理复杂的交互 至关重要 。此外,我将匹配项锚定在该行的末尾并添加了 () 以使密码更易于提取。