bash e espera no mesmo script?

7

Estou tentando codificar um script que usa endereços IP de um arquivo .csv e telnetar o dispositivo para capturar a saída de comando "show version".

Até agora eu codifiquei isto:

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

Eu preciso completar o loop for para que ele se conecte via telnet ao IP armazenado em $ IP e salve a saída "show version".

Eu tentei com isso:

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    

mas não funcionou.

Isso é porque eu não posso usar bash e esperar?

Caso essa seja a razão ... como posso enviar $ IP e $ NUMDISP como uma variável para um script de expectativa diferente? (é por isso que eu acho que é diferente da outra pergunta)

    
por Cesar Alejandro Villegas Yepez 14.03.2017 / 18:18

1 resposta

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

Umm ... não.

Basicamente, você quer que ambos os programas leiam o seu script e "façam a coisa certa" em relação a cada linha. Além dos problemas entre sincronizar a execução do script entre os intérpretes, é fácil ver que isso é impossível no momento em que temos uma linha que pode ser um comando válido em qualquer idioma.

Considere algo assim em seu exemplo.

set Username "user" 

Na verdade, ele é válido no shell e em um script de expectativa. No shell, ele define os parâmetros posicionais $1 e $2 a Username e user , respectivamente. Em expect , atribui outra coisa. Qual deles deveria fazer?

Ou divida seu script esperado em um arquivo diferente e chame-o do shell script, ou use o fato de que o Expect é executado no TCL, que deve permitir fazer loops e IO em si mesmo.

Felizmente, neste caso, há apenas um snippet esperado contido em um loop de shell no segundo bloco de código.

Então, faça um script de shell

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

e um script de espera para chamar a partir do script de shell:

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