bash e aspettarti nello stesso script?

Sto cercando di codificare uno script che prenda indirizzi IP da un file .csv e telnet il dispositivo per catturare loutput del comando “show version”.

Finora ho codificato questo:

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

Devo completare il ciclo for in modo che si connetta tramite telnet allIP memorizzato in $ IP e salva loutput di “mostra versione”.

Ho provato con questo:

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 

ma non ha funzionato.

È questa la causa che non posso usare bash e mi aspetto?

Nel caso in cui questo sia il motivo .. come posso inviare $ IP e $ NUMDISP come variabile in uno script di aspettativa diverso? (questo è per questo che penso che sia diverso dallaltra domanda)

Commenti

Risposta

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

Umm … no.

Fondamentalmente vuoi sia programmi per leggere il tuo script e “fare la cosa giusta” per quanto riguarda ogni riga. A parte i problemi tra la sincronizzazione dellesecuzione dello script tra gli interpreti, è facile vedere che questo è impossibile nel momento in cui abbiamo una riga che potrebbe essere un comando valido in entrambe le lingue.

Considera qualcosa di simile in il tuo esempio.

set Username "user" 

È effettivamente valido sia nella shell che in uno script previsto. Nella shell, imposta i parametri posizionali $1 e $2 su Username e user, rispettivamente. In expect assegna qualcosaltro. Quale dovrebbe fare?

Dividi il tuo script Expect in un file diverso e chiamalo dallo script della shell, oppure usa il fatto che Expect gira su TCL che dovrebbe consentire di fare loop e IO in sé.


Fortunatamente in questo caso, cè solo uno snippet previsto contenuto in un ciclo di shell nel secondo blocco di codice.

Quindi, crea uno script di shell

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

e uno script previsto da chiamare dallo script della shell:

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

Commenti

  • @cesar, ci sono modi per inserire uno script di aspettativa allinterno di uno script di shell, ma ci sono sempre grattacapi intorno a citazioni e variabili. Questo è il modo più pulito.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *