bash y esperar en el mismo guion?

Estoy intentando codificar una secuencia de commands que toma direcciones IP de un file .csv y telnet el dispositivo para capturar el resultado del command "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 ciclo for para que se conecte a través de telnet a la IP almacenada en $ IP y guarde la salida "mostrar versión".

Lo 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 ese sea el motivo … ¿cómo puedo enviar $ IP y $ NUMDISP como una variable a un script de espera diferente? (esta es la razón por la que creo que es diferente a la otra pregunta)

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

Umm no.

Básicamente, desea que los progtwigs lean su secuencia de commands y "hagan lo correcto" con respecto a cada línea. Además 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 command válido en cualquier idioma.

Considera algo como esto en tu ejemplo.

 set Username "user" 

En realidad es válido tanto en el shell como en un script esperado. En el shell, establece los parameters posicionales $1 y $2 para Username de Username y user , respectivamente. En expect le asigna otra cosa. ¿Cuál debería ser?

O divida su secuencia de commands de espera en un file diferente y llámelo del script de shell, o use el hecho de que Expect se ejecuta en TCL, lo que debería permitir hacer loops e IO en sí mismo.


Afortunadamente, en este caso, solo hay un fragment esperado dentro de un bucle de shell en su segundo bloque de código.

Entonces, crea un script de shell

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

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

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