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.
expect
pode ler um arquivo CSV, como mostrei em unix.stackexchange.com/questions/350338/…