bash y esperar en el mismo script?

9

Estoy tratando de codificar una secuencia de comandos que tome direcciones IP de un archivo .csv y haga telnet al dispositivo para capturar la salida del comando "show version".

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 guarde la salida "show version".

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 por esto que no puedo usar bash y esperar?

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

Cesar Alejandro Villegas Yepez
fuente
2
No mezcle los idiomas, expectpuede leer un archivo CSV, como lo mostré en unix.stackexchange.com/questions/350338/…
thrig
@thrig the OP obviamente no siente que sea un engaño ya que acaban de hacer esta pregunta.
terdon
Hice ambas preguntas, creo que esto es un poco diferente al otro.
Cesar Alejandro Villegas Yepez

Respuestas:

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

Umm no.

Básicamente, desea que ambos programas lean su script 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 comando válido en cualquier idioma.

Considere algo como esto en su ejemplo.

set Username "user" 

En realidad, es válido tanto en el shell como en un script de esperar. En el shell, establece los parámetros posicionales $1y $2a Usernamey user, respectivamente. En expectella se 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 esperado contenido 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 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"
...
ilkkachu
fuente
1
@cesar, hay formas de colocar 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.
Glenn Jackman