Publicado por Gnu Linux on 14 de Junio de 2007
Hola, hoy os quería hablar de una herramienta que he encontrado por casualidad navegando por la red. Se llama “expect” y según su descripción viene a ser un “dialogo programado con procesos interactivos”.
¿Cuantas veces, realizando vuestros scripts en bash, se os requería la contraseña de Super Usuario y teníais que introducirla a mano? A primera vista tendríais que ejecutar ese script con privilegios de root, con el riesgo que eso conlleva…
Para evitar ese riesgo aparece expect. Expect os permite ejecutar comandos y esperar una salida determinada por stdout o consola, como queráis llamarlo. Una vez recibe esa cadena, continua con el resto de instrucciones y permite enviar señales por stdin o teclado.
Así a primera vista me parece un modo de comunicación síncrona entre varios procesos. Las funciones principales que usaremos, que no digo que sean las únicas, serán:
- spawn: Permite la ejecución de comandos por consola.
- expect: Espera por una cadena predefinida en stdout.
- send: Envía comandos por stdin con el proceso.
Si esta herramienta la combinamos con scripts nuestros, realmente se pueden hacer autenticas virguerias. A continuación os voy a poner un ejemplo muy básico que me he creado para subir ficheros por sftp con otro equipo:
#!/usr/bin/expect
spawn sftp 192.168.1.2
expect “mygnulinux@192.168.1.2’s password:”
send “mygnulinux\r”
expect “sftp>”
send “cd /home/mygnulinux\r”
expect “sftp>”
send “put *\r”
expect “sftp>”
send “exit\r”
expect eof
Nota: Al finalizar pondremos “expect eof” para terminar la ejecución de expect. Cuando enviamos una señal debemos poner al final ‘\r’ que viene a ser el retorno de carro o intro para que sea aceptada en la linea de comandos.
Si alguien tiene algo nuevo que añadir o bien encuentra algún fallo me gustaría me corrigiese en comentarios ya que no lo he probado mucho y no se en realidad cuanto poder tiene este comando.
Actualizaciçon 15/12/2011
Tambiçen existe el "autoexpect" y para finalizar la grabaciçon CtrlD ¿mirar manual
`