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.