2016-09-09 2 views
0

Мне нужно принять пароль с клавиатуры, содержащий хотя бы одно число, хотя бы одну прописную букву, хотя бы одну строчную букву и необязательные символы # & - Я написал следующий код. Он всегда раз, но не обнаруживает пароль ... Может кто-нибудь помочьЗапрос пароля с использованием 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 не обнаруживает ее и собирается выполнить следующую попытку и, наконец, тайм-ауты

+0

Возможно, вы ищете 'send_user' и' expect_user' –

ответ

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 говорит «держать на ожидали; мы еще не закончили », и это vital для решения сложных взаимодействий. Кроме того, я привязал матч в конце строки и добавил ( ... ), чтобы сделать пароль более легким для извлечения.