Вы не указали, как он должен понять, что логин произошёл. Что сервер должен выдать после успешного логина? Ожидайте этой строки так же, как ожидаете строки "UserName:" или "PassWord:"
Вы не указали, как он должен понять, что логин произошёл. Что сервер должен выдать после успешного логина? Ожидайте этой строки так же, как ожидаете строки "UserName:" или "PassWord:"
Понял, ступил.
Но задам пока еще вопрос, подскажите на оборудовании может быть несколько разных паролей, как мне лучше сделать при Fail пробовать залогинится с друшим паролем?
Но задам пока еще вопрос, подскажите на оборудовании может быть несколько разных паролей, как мне лучше сделать при Fail пробовать залогинится с друшим паролем?
Можно в fail присваивать переменным $user и $password другие значения и не делать exit, если только варианты не закончились.
Аналогично пытается авторизоваться, заново если пароль не верный, а должен выйти. Где я еще напортачил.
А если удачно авторизовался, то выполняет команду по кругу
Так. Вы, похоже, не понимаете, что этот текст делает.
Команда "while 1 { }" - это бесконечный цикл. Повторяет тело, пока не будет завершён принудительно, например, с помощью "exit" (выход из программы) или "break" (выход из цикла). Находящаяся внутри команда "expect { }" - это ветвление. Ждать, пока не встретится одна из строк или не истечёт время, выполнить соответствующую ветку, перейти к команде за последней веткой (в данном случае - перейти на следующую итерацию цикла). Разумеется, он будет выполнять всё по кругу. Если не хотите этого, то или выходите из цикла, или не используйте цикл вообще, а вместо него расположите в ряд несколько "expect { }".
while 1 { expect {
"UserName:" {send "$user\n"}
"PassWord:" {send "$password\n"}
"Fail!" {send_user "Нет доступа к FTP-серверу.\r"; exit 1}
timeout {send_user "Время ожидания ответа истекло.\r"; exit 2}
"*#" {break}
}}
Правильно я вас понял?
Если "Fail!" - это то, что сервер выдаёт, если пароль неправильный, а после появления "*#" вам нужно просто "вывалиться", то вы всё написали правильно.
Правильно я вас понял?
Если "Fail!" - это то, что сервер выдаёт, если пароль неправильный, а после появления "*#" вам нужно просто "вывалиться", то вы всё написали правильно.
Да сейчас эта логика работает, если пароль верный выход из цикла отрабатывает.
Но вот если Fail! получаю, то подскажите как мне указать ввести другие пароли? И как правильно break поставить, а то все перепробовал уходит в цикл и все тут
Проверил ваш пример не работает, после не верной попытки ввода логина и пароля, пауза потом постоянно цикл ввода логина и пароля.
Долго не мог проверить, был сильно занят.
Проверил ваш пример не работает, после не верной попытки ввода логина и пароля, пауза потом постоянно цикл ввода логина и пароля.
Долго не мог проверить, был сильно занят.
У меня работает. Приведите полностью скрипт, как запускаете, и полный диалог скрипта с сервером (пароль можете заменить звёздочками).
Проверил ваш пример не работает, после не верной попытки ввода логина и пароля, пауза потом постоянно цикл ввода логина и пароля.
Долго не мог проверить, был сильно занят.
У меня работает. Приведите полностью скрипт, как запускаете, и полный диалог скрипта с сервером (пароль можете заменить звёздочками).
Ситуация аналогичная, вводит логин и пароль первый по кругу.
Приведите более крупный фрагмент лога, и не меняйте в нём ничего, кроме паролей. К примеру, при сбое выводится именно "Fail!" или вы заменяете этим словом настоящий текст?
Ладно... Попробуйте так.
В одной консоли:
nc -l -p 7777
В другой запустите скрипт, в том виде, в котором я его привёл, без малейших модификаций, следующей командой (опять же, дословно; измените только имя скрипта):
expect -f script.expect 127.0.0.1 7777 user pass1 pass2 pass3
И попробуйте в первой консоли вводить приглашения, вроде "UserName:", "PassWord:", "Fail!" и "*#".
expect: spawn id exp5 not open
while executing
"expect {
"UserName:" {send "$user\n"}
"PassWord:" {send "$password\n"}
"Fail!" { incr ipass; set password [lindex $passwords $ipass]; if { "$password"..."
("while" body line 1)
invoked from within
"while 1 { expect {
"UserName:" {send "$user\n"}
"PassWord:" {send "$password\n"}
"Fail!" { incr ipass; set password [lindex $passwords $ipass]; if { "..."
(file "./unixforum.exp" line 16)
Если подключаюсь не к свитчу, а к виндузовой машине с телнетом. То выдается сообщения "Время ожидание истекло".