【问题标题】:Password prompt using Expect not working使用 Expect 的密码提示不起作用
【发布时间】:2016-09-09 10:50:30
【问题描述】:

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

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

【问题讨论】:

  • 您可能正在寻找send_userexpect_user

标签: regex passwords tcl expect


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2011-06-14
    相关资源
    最近更新 更多