while script programas programacion pasar parametros operaciones ejemplos aritmeticas bash automation telnet expect conditional-statements

bash - programas - shell script linux



Usando sentencias condicionales dentro de ''esperar'' (3)

Con un poco de golpes encontré una solución. Resulta que esperar utiliza una sintaxis TCL con la que no estoy familiarizado en absoluto:

#!/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

Esperemos que esto sea de utilidad para otros.

Necesito automatizar el inicio de sesión en una sesión de TELNET utilizando expectativa , pero debo ocuparme de varias contraseñas para el mismo nombre de usuario.

Aquí está el flujo que necesito crear:

  1. Abrir sesión de TELNET a una IP
  2. Enviar nombre de usuario
  3. Enviar contraseña
  4. ¿Contraseña incorrecta? Envía de nuevo el mismo nombre de usuario, luego una contraseña diferente
  5. Debería haber iniciado sesión correctamente en este punto ...

Para 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"

No hace falta decir que esto no funciona, y tampoco se ve muy bonito. De mis aventuras con Google, parece ser una especie de arte oscuro. Gracias de antemano a cualquier persona por su ayuda en el asunto!


Si conoce los ID de usuario y las contraseñas, también debe saber qué pares de ID de usuario / contraseña están alineados con qué sistemas. Creo que sería mejor mantener un mapa del par de usuario / contraseña que va con el sistema y luego extraer esa información y simplemente usar la correcta.

Entonces, como obviamente no te gustan mis consejos, te sugiero que mires la página de wikipedia e implementes un procedimiento que devuelve 0 si tiene éxito y 1 si la expectativa se agota. Eso le permitirá detectar cuándo falló la contraseña provista, la expectativa de solicitud caduca y volver a intentarlo. Si esto es útil, puedes eliminar tu voto negativo ahora que lo he editado.

En retrospectiva, probablemente querrá hacer esto en conjunto con el mapa, ya que querría detectar un inicio de sesión fallido si se cambió la contraseña.


Tengo que recomendar el libro Exploring Expect para todos los programadores de expectativa: invaluable.

He reescrito tu 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 vuelve al principio del bloque de espera, es como una declaración de "rehacer".

Tenga en cuenta que send_user termina con /n not /r

No tiene que escapar del carácter > en su solicitud: no es especial para Tcl.