bash e aspettarsi nella stessa sceneggiatura?


9

Sto cercando di codificare uno script che prende gli indirizzi IP da un file .csv e telnet il dispositivo per catturare l'output 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 via telnet all'IP memorizzato a $ IP e salvare l'output "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 causa che non posso usare bash e aspettarmi?

Nel caso sia questo il motivo ... come posso inviare $ IP e $ NUMDISP come variabile in uno script di attesa diverso? (ecco perché penso che sia diverso dall'altra domanda)


2
Non mescolare le lingue, expectposso leggere un file CSV, come ho mostrato in unix.stackexchange.com/questions/350338/…
thrig


@thrig the OP ovviamente non ritiene che sia un imbecille da quando hanno appena fatto questa domanda.
terdon

Ho fatto entrambe le domande, penso che questo sia un po 'diverso dall'altro.
Cesar Alejandro Villegas Yepez,

Risposte:


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

Umm ... no.

Fondamentalmente vuoi che entrambi i programmi leggano la tua sceneggiatura e "fai la cosa giusta" per ogni riga. A parte i problemi tra la sincronizzazione dell'esecuzione dello script tra gli interpreti, è facile vedere che questo è impossibile nel momento in cui abbiamo una linea che potrebbe essere un comando valido in entrambe le lingue.

Considera qualcosa di simile nel tuo esempio.

set Username "user" 

In realtà è valido sia nella shell che in uno script prevede. Nella shell, imposta i parametri posizionali $1e $2di Usernamee user, rispettivamente. In expectesso assegna qualcos'altro. Quale dovrebbe fare?

O dividi il tuo script di attesa in un file diverso e chiamalo dallo script di shell, oppure usa il fatto che Expect viene eseguito su TCL che dovrebbe consentire di fare loop e IO in sé.


Fortunatamente in questo caso, c'è solo uno snippet di attesa contenuto in un loop 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 prevede di chiamare dallo script shell:

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

1
@cesar, ci sono modi per inserire uno script prevede all'interno di uno script di shell, ma ci sono sempre mal di testa in termini di quotazioni e variabili. Questo è il modo più pulito.
Glenn Jackman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.