bash y esperar en el mismo script?

Estoy tratando de codificar una secuencia de comandos que toma direcciones IP de un archivo .csv y telnet el dispositivo para capturar la salida del comando «mostrar versión».

Hasta ahora he codificado esto:

#!/bin/bash #!/usr/bin/expect -f FILE1=dispositivos.csv #file with IP"s and device name set Username "user" #this is the user for telnet connection. set Password "this.is.the.pass" #pass for telnet connection. NUMERODISP="$(wc -l $FILE1 | awk "{print $1}")" #this command counts number of devices (IP"s) in the file as it is a .csv file, it only counts number of lines. for i in `seq 2 $NUMERODISP`; do IP="$(awk -vnum="$i" "NR == num { print $NF }" dispositivoss.csv)" echo "$IP" #this takes the IP from last column from .csv file done 

Necesito completar el bucle for para que se conecte a través de telnet a la IP almacenada en $ IP y guardar la salida «mostrar versión».

He intentado con esto:

for i in `seq 2 $NUMERODISP`; do IP="$(awk -vnum="$i" "NR == num { print $NF }" dispositivoss.csv)" send "telnet $IP\r" expect "Username:" send "$Username\r" expect "Password: " send "$Password\r" expect "*>" send "show version\r" log_file -noappend SN_$IP.dat; expect -ex "--More--" {send -- " "; exp_continue} expect "*>" log_file; done 

pero no funcionó.

¿Es esto porque no puedo usar bash y esperar?

En caso de que esa sea la razón … ¿cómo puedo enviar $ IP y $ NUMDISP como una variable en un script de espera diferente? (esto es por eso que creo que es diferente a la otra pregunta)

Comentarios

Respuesta

#!/bin/bash #!/usr/bin/expect -f 

Umm … no.

Básicamente, quieres tanto programas para leer su script y «hacer lo correcto» con respecto a cada línea. Aparte de los problemas entre sincronizar la ejecución del script entre los intérpretes, es fácil ver que esto es imposible en el momento en que tenemos una línea que podría ser un comando válido en cualquier idioma.

Considere algo como esto en su ejemplo.

set Username "user" 

Es realmente válido tanto en el shell como en un script de espera. En el shell, establece los parámetros posicionales $1 y $2 en Username y user, respectivamente. En expect asigna algo más. ¿Cuál debería hacer?

Divida su script de espera en un archivo diferente y llámelo desde el script de shell, o use el hecho de que Expect se ejecuta en TCL, lo que debería permitir hacer bucles e IO en sí mismo.


Afortunadamente en este caso, solo hay un fragmento de espera contenido dentro de un bucle de shell en su segundo bloque de código.

Entonces, haga un script de shell

#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done 

y un script de espera para llamar desde el script de shell:

#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ... 

Comentarios

  • @cesar, hay formas de poner un script de espera dentro de un script de shell, pero siempre hay dolores de cabeza en torno a las citas y las variables. Esta es la forma más limpia.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *