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.
expect
può leggere un file CSV, come ho mostrato in unix.stackexchange.com/questions/350338/…