Я работаю над сценарием Expect для получения информации о конфигурации с моих хостов.
Проблема в том, что некоторые из моих хостов (при вводе команды enable) будут запрашивать и логин, и пароль. В основном это старый комплект HP, но я встречал его и в другом месте.
Вложенный оператор ожидания, подобный следующему, сделал бы это, если бы он был допустимым синтаксисом. Как я могу это сделать?
expect {
default { send_user "\nEnable Mode Failed - Check Password\n"; exit 1 }
"*\#" {}
"*>" {
send "enable\n"
expect{
"Login" {
send "$username\n"
}
default {}
}
expect "*assword"
send "$enablepassword\n"
expect "*\#"
}
}
Я знаю, что синтаксис у меня немного не работает - я видел множество ссылок, описывающих использование вложенных ожиданий, - но, хоть убей, я не могу этого понять.
Вы могли бы написать это так:
exp_internal 1
expect {
default { send_user "\nEnable Mode Failed - Check Password\n"; exit 1 }
"*>" {
send "enable\r"
expect{
"Login" {
send "$username\r"
exp_continue
}
"*assword" {
send "$enablepassword\r"
}
}
# Now, look back to the outer expect to continue expecting the "#" prompt
exp_continue
}
"*#"
}
exp_internal 1
для включения отладкиsend
команды с \r
(возврат каретки - это "нажатие клавиши ввода")exp_continue
зацикливаться внутри содержащего expect
продолжать искать другие шаблоны.Благодаря Гленну, у меня есть сценарий, который позволит мне получать информацию с любого из моих различных устройств Cisco или HP.
#!/usr/bin/expect -f
set hostname [lindex $argv 0];
set username [lindex $argv 1];
set password [lindex $argv 2];
set enablepassword [lindex $argv 3];
spawn ssh -o StrictHostKeyChecking=no $username\@$hostname
expect {
timeout { send_user "\nTimeout Exceeded - Check Host\n"; exit 1 }
eof { send_user "\nSSH Connection To $hostname Failed\n"; exit 1 }
"*\#" {}
"*assword:" {
send "$password\n"
}
}
# This allows for handling any of the various HP login screens.
sleep 5
send " "
sleep 5
send "3\n"
sleep 5
expect {
"*>" {
send "enable\n"
expect {
"*ogin" {
send "$username\n"
}
}
expect {
"*assword" {
send "$enablepassword\n"
exp_continue
}
exp_continue
}
}
"*\#" {}
default { send_user "\nEnable Mode Failed - Check Password\n"; exit 1 }
}
# Disable paging. This is both the HP and Cisco statements.
send "terminal length 0\n"
send "no page\n"
expect "*\\#"
log_file -noappend ./$hostname
send "show run\n"
expect "#\n"
log_file
send "end\n"
expect "\#"
expect "\#"
send "exit\n"
expect ":~\$"
exit