bash og forvent i samme skript?

Jeg prøver å kode et skript som tar IP-adresser fra en .csv-fil og telnet enheten for å fange kommandoutputen «show version».

Så langt har jeg kodet dette:

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

Jeg må fullføre for loop slik at den kobles via telnet til IP lagret på $ IP og lagre «vis versjon» -utdata.

Jeg har prøvd med dette:

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 

men det fungerte ikke.

Er dette årsaken til at jeg ikke kan bruke bash og forvente?

Hvis det er grunnen .. hvordan kan jeg sende $ IP og $ NUMDISP som en variabel til et annet forventningsskript? (dette er hvorfor jeg tror det er annerledes enn det andre spørsmålet)

Kommentarer

Svar

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

Umm … nei.

I utgangspunktet vil du ha for begge programmer for å lese manuset ditt, og «gjøre det rette» angående hver linje. Bortsett fra problemene mellom å synkronisere skriptutførelsen mellom tolkerne, er det lett å se at dette er umulig i det øyeblikket vi har en linje som kan være en gyldig kommando på begge språk.

Tenk på noe slikt i eksempelet ditt.

set Username "user" 

Det er faktisk gyldig i både skallet og i et forventet skript. I skallet setter den posisjonsparametrene $1 og $2 til Username og user, henholdsvis. I expect tildeles den noe annet. Hvilken skal den gjøre?

Enten del forventningsskriptet ditt til en annen fil og kaller det fra skallskriptet, eller bruk det faktum at Expect kjører på TCL, som skal tillate å gjøre looper og IO i seg selv.


Heldigvis i dette tilfellet er det bare en forventet kodebit inneholdt i en skallsløyfe i den andre kodeblokken din.

Så lag et skallskript

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

og et forventet skript skal ringe fra skallskriptet:

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

Kommentarer

  • @cesar, det er måter å plassere et forventet skript i et skallskript, men det er alltid hodepine rundt sitering og variabler. Dette er den reneste måten.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *