Uso de declaraciones condicionales dentro de 'esperar'
-
20-09-2019 - |
Pregunta
necesito para automatizar iniciar sesión en una sesión Telnet mediante espero , pero tengo que cuidar de múltiples contraseñas para el mismo nombre de usuario.
Aquí está el flujo Necesito crear:
- Abrir sesión TELNET a una IP
- Enviar user-name
- Enviar contraseña
- Contraseña incorrecta? Enviar el mismo nombre de usuario nuevo, entonces una contraseña diferente
- Debe haber iniciado la sesión en el éxito en este punto ...
Por lo que vale, esto es lo que tengo hasta ahora:
#!/usr/bin/expect
spawn telnet 192.168.40.100
expect "login:"
send "spongebob\r"
expect "password:"
send "squarepants\r"
expect "login incorrect" {
expect "login:"
send "spongebob\r"
expect "password:"
send "rhombuspants\r"
}
expect "prompt\>" {
send_user "success!\r"
}
send "blah...blah...blah\r"
Huelga decir que esto no funciona, y tampoco se ve muy bonito. De mis aventuras con Google esperar parece ser algo de un arte oscuro. Gracias de antemano a cualquier persona para la asistencia en la materia!
Solución
Tener a recomendar la rel="noreferrer"> para todos esperan que los programadores -. Inestimable
He reescrito el código: (no probado)
proc login {user pass} {
expect "login:"
send "$user\r"
expect "password:"
send "$pass\r"
}
set username spongebob
set passwords {squarepants rhombuspants}
set index 0
spawn telnet 192.168.40.100
login $username [lindex $passwords $index]
expect {
"login incorrect" {
send_user "failed with $username:[lindex $passwords $index]\n"
incr index
if {$index == [llength $passwords]} {
error "ran out of possible passwords"
}
login $username [lindex $passwords $index]
exp_continue
}
"prompt>"
}
send_user "success!\n"
# ...
exp_continue
un bucle de vuelta al comienzo del bloque de esperar - es como una declaración "rehacer"
Tenga en cuenta que send_user
termina con \n
no \r
Usted no tiene que escapar el carácter >
en su línea de comandos:. No es especial para Tcl
Otros consejos
Con un poco de golpear he encontrado una solución. Resulta que esperar utiliza una sintaxis TCL que no estoy del todo familiarizado con:
#!/usr/bin/expect
set pass(0) "squarepants"
set pass(1) "rhombuspants"
set pass(2) "trapezoidpants"
set count 0
set prompt "> "
spawn telnet 192.168.40.100
expect {
"$prompt" {
send_user "successfully logged in!\r"
}
"password:" {
send "$pass($count)\r"
exp_continue
}
"login incorrect" {
incr count
exp_continue
}
"username:" {
send "spongebob\r"
exp_continue
}
}
send "command1\r"
expect "$prompt"
send "command2\r"
expect "$prompt"
send "exit\r"
expect eof
exit
Esperamos que esto sea útil para otros.
Si conoce los identificadores de usuario y contraseñas, entonces también debería saber qué ID de usuario / contraseña pares están alineados con los cuales los sistemas. Creo que sería mejor mantener un mapa de los cuales ID de usuario / contraseña par va con qué sistema extrayendo después de que la información y simplemente utilizar la correcta.
Por lo tanto - ya que, obviamente, no le gusta mi consejo, entonces le sugiero que busque en el Wikipedia e implementar un procedimiento que devuelve 0 si tiene éxito y 1 si los tiempos de expectativa a cabo. Eso le permitirá detectar cuando la contraseña suministrada no - los tiempos de expectativas inmediatas a cabo - y vuelva a intentar. Si esto es útil, puede retirar la downvote ahora que he editado a él.
En retrospectiva, lo que probablemente quiere hacer esto en conjunto con el mapa de todos modos ya que querrías para detectar un inicio de sesión fallido si se cambió la contraseña.