bash e espera no mesmo script?

Estou tentando codificar um script que obtém endereços IP de um arquivo .csv e telnet para o dispositivo para capturar a saída do comando “show version”.

Até agora, codifiquei isso:

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

Preciso completar o loop for para que ele se conecte via telnet ao IP armazenado em $ IP e salve a saída de “mostrar versão”.

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.

É esta a causa que não posso usar bash and expect?

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

Comentários

Resposta

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

Umm … não.

Basicamente, você deseja que os programas para ler seu script e “fazer 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 um dos idiomas.

Considere algo assim em seu exemplo.

set Username "user" 

É realmente válido tanto no shell quanto em um script expect. No shell, ele define os parâmetros posicionais $1 e $2 para Username e user, respectivamente. Em expect, ele atribui outra coisa. Qual deve ser feito?

Divida o seu script expect em um arquivo diferente e chame-o a partir do script de shell, ou use o fato de que o Expect é executado em TCL, o que deve permitir fazer loops e IO em si mesmo.


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

Portanto, 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 esperado 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" ... 

Comentários

  • @cesar, existem maneiras de colocar um script expect dentro de um script de shell, mas sempre há dores de cabeça em torno de citações e variáveis. Esta é a maneira mais limpa.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *