Expect не отрабатывает while

На самом деле это единственный раздел про unix на этом форуме

Модератор: /dev/random

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Expect не отрабатывает while

Сообщение Voler » 13.08.2015 09:44

Добрый день.

Помогите со скриптом expect

Код: Выделить всё

#!/usr/bin/expect -f
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set prompt "(%|#|\\$) $";
catch {set prompt $env(EXPECT_PROMPT)}
log_file -noappend sw08.log
# Отключим вывод
#log_user 0
set timeout 10
spawn telnet $ip

while 1 { expect {
        "UserName:" {send "$user\n"}
        "PassWord:" {send "$password\n"}
        "Fail!" {send_user "Нет доступа к FTP-серверу.\r"; exit 1}
        timeout {send_user "Время ожидания ответа истекло."\r"; exit 2}
}}

Почему то при не верном пароле, не завершает работу, а постоянно переподключается.
Подскажите где ошибся?
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 2603
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Expect не отрабатывает while

Сообщение Hephaestus » 13.08.2015 09:49

Voler писал(а):
13.08.2015 09:44
timeout {send_user "Время ожидания ответа истекло."\r"; exit 2}
По-моему, здесь кавычка лишняя. Хотя причина не в этом.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 13.08.2015 10:26

Во-первых, уберите лишнюю кавычку перед \r.
Во-вторых, скажите expect'у, что делать после успешного ввода пароля и как определить, что он был успешен.
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 13.08.2015 13:21


while 1 { expect {
"UserName:" {send "$user\n"}
"PassWord:" {send "$password\n"}
"Fail!" {send_user "Нет доступа к FTP-серверу.\r"; exit 1}
timeout {send_user "Время ожидания ответа истекло.\r"; exit 2}
send "disable snmp\r"
}}

Поправил эфект тот же
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 13.08.2015 13:51

Voler писал(а):
13.08.2015 13:21
while 1 { expect {
"UserName:" {send "$user\n"}
"PassWord:" {send "$password\n"}
"Fail!" {send_user "Нет доступа к FTP-серверу.\r"; exit 1}
timeout {send_user "Время ожидания ответа истекло.\r"; exit 2}
send "disable snmp\r"
}}

Поправил эфект тот же

Вы не указали, как он должен понять, что логин произошёл. Что сервер должен выдать после успешного логина? Ожидайте этой строки так же, как ожидаете строки "UserName:" или "PassWord:"
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 13.08.2015 14:01

Вы не указали, как он должен понять, что логин произошёл. Что сервер должен выдать после успешного логина? Ожидайте этой строки так же, как ожидаете строки "UserName:" или "PassWord:"

Понял, ступил.

Но задам пока еще вопрос, подскажите на оборудовании может быть несколько разных паролей, как мне лучше сделать при Fail пробовать залогинится с друшим паролем?
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 13.08.2015 15:03

Voler писал(а):
13.08.2015 14:01
Но задам пока еще вопрос, подскажите на оборудовании может быть несколько разных паролей, как мне лучше сделать при Fail пробовать залогинится с друшим паролем?

Можно в fail присваивать переменным $user и $password другие значения и не делать exit, если только варианты не закончились.
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 13.08.2015 15:18

#!/usr/bin/expect -f
if {[llength $argv] != 3} {
puts "Вызов: sw08.exp <ИМЯ_ХОСТА> <ИМЯ> <ПАРОЛЬ>"
exit 1
}
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set prompt "(%|#|\\$) $";
catch {set prompt $env(EXPECT_PROMPT)}
log_file -noappend sw08.log
# Отключим вывод
#log_user 0
set timeout 10
spawn telnet $ip


while 1 { expect {
"UserName:" {send "$user\n"}
"PassWord:" {send "$password\n"}
"Fail!" {send_user "Нет доступа к FTP-серверу.\r"; exit 1}
timeout {send_user "Время ожидания ответа истекло.\r"; exit 2}
"*#" {send "disable snmp\r"}
}}

Аналогично пытается авторизоваться, заново если пароль не верный, а должен выйти. Где я еще напортачил.
А если удачно авторизовался, то выполняет команду по кругу
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 13.08.2015 15:29

Так. Вы, похоже, не понимаете, что этот текст делает.
Команда "while 1 { }" - это бесконечный цикл. Повторяет тело, пока не будет завершён принудительно, например, с помощью "exit" (выход из программы) или "break" (выход из цикла). Находящаяся внутри команда "expect { }" - это ветвление. Ждать, пока не встретится одна из строк или не истечёт время, выполнить соответствующую ветку, перейти к команде за последней веткой (в данном случае - перейти на следующую итерацию цикла). Разумеется, он будет выполнять всё по кругу. Если не хотите этого, то или выходите из цикла, или не используйте цикл вообще, а вместо него расположите в ряд несколько "expect { }".
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 13.08.2015 15:30

/dev/random писал(а):
13.08.2015 15:29
Так. Вы, похоже, не понимаете, что этот текст делает.

Что такое цикл, понятно а вот про break ща попробую

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}
}}

Правильно я вас понял?
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 13.08.2015 15:57

Voler писал(а):
13.08.2015 15:30
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!" - это то, что сервер выдаёт, если пароль неправильный, а после появления "*#" вам нужно просто "вывалиться", то вы всё написали правильно.
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 13.08.2015 16:10

Правильно я вас понял?
Если "Fail!" - это то, что сервер выдаёт, если пароль неправильный, а после появления "*#" вам нужно просто "вывалиться", то вы всё написали правильно.


Да сейчас эта логика работает, если пароль верный выход из цикла отрабатывает.
Но вот если Fail! получаю, то подскажите как мне указать ввести другие пароли? И как правильно break поставить, а то все перепробовал уходит в цикл и все тут
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 13.08.2015 16:37

Voler писал(а):
13.08.2015 16:10
Но вот если Fail! получаю, то подскажите как мне указать ввести другие пароли?

Как-нибудь так:

Код: Выделить всё

while 1 { expect {
  "UserName:" {send "$user\n"}
  "PassWord:" {send "$password\n"}
  "Fail!" { if { "$user" eq "user1" } { set user "user2"; set password "pass2"; } else { send_user "Нет доступа к FTP-серверу.\r"; exit 1 }}
  timeout {send_user "Время ожидания ответа истекло.\r"; exit 2}
  "*#" {break}
}}

Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 14.09.2015 20:07


Проверил ваш пример не работает, после не верной попытки ввода логина и пароля, пауза потом постоянно цикл ввода логина и пароля.
Долго не мог проверить, был сильно занят.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 14.09.2015 20:17

Voler писал(а):
14.09.2015 20:07
Проверил ваш пример не работает, после не верной попытки ввода логина и пароля, пауза потом постоянно цикл ввода логина и пароля.
Долго не мог проверить, был сильно занят.

У меня работает. Приведите полностью скрипт, как запускаете, и полный диалог скрипта с сервером (пароль можете заменить звёздочками).
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 21.09.2015 15:29

/dev/random писал(а):
14.09.2015 20:17
Voler писал(а):
14.09.2015 20:07
Проверил ваш пример не работает, после не верной попытки ввода логина и пароля, пауза потом постоянно цикл ввода логина и пароля.
Долго не мог проверить, был сильно занят.

У меня работает. Приведите полностью скрипт, как запускаете, и полный диалог скрипта с сервером (пароль можете заменить звёздочками).

Код: Выделить всё

#!/usr/bin/expect -f
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set prompt "(%|#|\\$) $";
set newpass [lindex $argv 4]
catch {set prompt $env(EXPECT_PROMPT)}
log_file -noappend expect_log.log
# Отключим вывод
log_user 0
set timeout 10
spawn telnet $ip
# Вывод отладки
#exp_internal 1
expect "UserName:"
send "$user\n"
expect "PassWord:"
send "$password\n"
log_user 1
expect -re $prompt
while 1 { expect {
  "UserName:" {send "$user\n"}
  "PassWord:" {send "$password\n"}
  "Fail!" { if { "$user" eq "user1" } { set user "admin"; set password "ddddd"; } else { send_user "Нет доступа \r"; exit 1 }}
  timeout {send_user "Время ожидания ответа истекло.\r"; exit 2}
  "*#" {break}
}}
# Отлов ошибки в авторизации
#expect eof
send "enable snmp\r"
#puts stdout "Snmp was enabled.\r"
send "enable sntp\r"
send "config sntp primary 10.3.7.3 secondary 10.3.7.65 poll-interval 720\r"
send "config time_zone operator + hour 3 min 0\r"
send "delete snmp community public\r"
send "delete snmp community private\r"
send "create snmp community ddddd view CommunityView read_write\r"
send "create snmp view all 1 view_type included\r"
send "create snmp group mon v3 auth_nopriv read_view all write_view all notify_view all\r"
send "create snmp user ddd mon encrypted by_password auth md5 dddd priv des dddd\r"
#send "config account admin encrypt plain_text dddd\n"
send "save all\r"
# Запоминаем результат в переменной. Он может быть отображён, или записан на диск.
# set results $expect_out(buffer)
sleep 5
send "logout\r"
send eof
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 21.09.2015 19:01

Вы не привели информацию о том, как запускаете (команду с параметрами), и диалог скрипта с сервером (лог).
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 22.09.2015 08:18

Запускаю ./dlink.exp ip login pass
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 24.09.2015 09:13

А лог вам как предоставить? Expect при таком запуске не выдает ошибку.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 24.09.2015 09:22

Voler писал(а):
24.09.2015 09:13
А лог вам как предоставить? Expect при таком запуске не выдает ошибку.

Закомментируйте строку "log_user 0" и посмотрите в терминале.
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 05.10.2015 13:07

/dev/random писал(а):
24.09.2015 09:22
Закомментируйте строку "log_user 0" и посмотрите в терминале.


Я вернулся,
Вот как выглядит.
spawn telnet 172.18.52.6
Trying 172.18.52.6...
Connected to 172.18.52.6.
Escape character is '^]'.

DES-3200-18 Fast Ethernet Switch
Command Line Interface

Firmware: Build 4.04.004
Copyright© 2013 D-Link Corporation. All rights reserved.
UserName:admin
PassWord:******
Fail!
UserName:admin
PassWord:******
Fail!

Может можно указать список возможных паролей?
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 05.10.2015 13:55

Понятно. Я писал, исходя из предположения, что у вас разные логины, а у вас везде admin. Кстати, вы могли бы и сами увидеть несоответствие.

Для одинакового логина, но разных паролей:

Код: Выделить всё

#!/usr/bin/expect -f
set ip [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set passwords [lrange $argv 3 end]
set ipass 0
set password [lindex $passwords $ipass]
set prompt "(%|#|\\$) $";
catch {set prompt $env(EXPECT_PROMPT)}
log_file -noappend expect_log.log
# Отключим вывод
log_user 0
set timeout 10
spawn nc $ip $port

while 1 { expect {
"UserName:" {send "$user\n"}
"PassWord:" {send "$password\n"}
"Fail!" { incr ipass; set password [lindex $passwords $ipass]; if { "$password" eq "" } { send_user "Нет доступа к FTP-серверу.\r"; exit 1 }}
timeout {send_user "Время ожидания ответа истекло.\r"; exit 2}
"*#" {break}
}}


Вызывать так:

./script ip port user pass1 pass2 pass3 ...
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 20.10.2015 18:27


DES-3200-18 Fast Ethernet Switch
Command Line Interface

Firmware: Build 4.39.B013
Copyright© 2012 D-Link Corporation. All rights reserved.
UserName:admin
admin

Ситуация аналогичная, вводит логин и пароль первый по кругу.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 20.10.2015 18:59

Voler писал(а):
20.10.2015 18:27
DES-3200-18 Fast Ethernet Switch
Command Line Interface

Firmware: Build 4.39.B013
Copyright© 2012 D-Link Corporation. All rights reserved.
UserName:admin
admin

Ситуация аналогичная, вводит логин и пароль первый по кругу.

Приведите более крупный фрагмент лога, и не меняйте в нём ничего, кроме паролей. К примеру, при сбое выводится именно "Fail!" или вы заменяете этим словом настоящий текст?
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 21.10.2015 07:54

Код: Выделить всё

                            Command Line Interface

                           Firmware: Build 1.00.021
           Copyright(C) 2013 D-Link Corporation. All rights reserved.
UserName:admin
admin
PassWord:asdfgh
******
Fail!
UserName:admin
admin
PassWord:asdfgh
******
Fail!
UserName:admin
admin
PassWord:asdfgh
******
Fail!
UserName:admin
admin
PassWord:asdfgh
******
Fail!
UserName:admin
admin
PassWord:asdfgh
******
Fail!
UserName:admin
admin
PassWord:asdfgh
******
Fail!
UserName:admin

Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 21.10.2015 22:18

У меня закончились идеи, почему он может у вас не работать. У меня прекрасно работает.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4876
ОС: Gentoo

Re: Expect не отрабатывает while

Сообщение /dev/random » 21.10.2015 22:30

Ладно... Попробуйте так.
В одной консоли:
nc -l -p 7777

В другой запустите скрипт, в том виде, в котором я его привёл, без малейших модификаций, следующей командой (опять же, дословно; измените только имя скрипта):

expect -f script.expect 127.0.0.1 7777 user pass1 pass2 pass3

И попробуйте в первой консоли вводить приглашения, вроде "UserName:", "PassWord:", "Fail!" и "*#".
Спасибо сказали:

Аватара пользователя
Voler
Сообщения: 490
ОС: Fedora

Re: Expect не отрабатывает while

Сообщение Voler » 22.10.2015 10:51

Если забыть указать порт , то вылетает такая ошибка

Код: Выделить всё

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)


Если подключаюсь не к свитчу, а к виндузовой машине с телнетом. То выдается сообщения "Время ожидание истекло".
Спасибо сказали: