bash og forvent i det samme script?

Jeg prøver at kode et script, der tager IP-adresser fra en .csv-fil og telnet enheden til at fange kommandoutput “show version”.

Indtil videre 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 har brug for at udføre for loop, så det forbinder via telnet til IP gemt til $ IP og gem output for “vis version”.

Jeg har prøvet 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 fungerede ikke.

Er det grunden til, at jeg ikke kan bruge bash og forvente?

I tilfælde af at det er årsagen .. hvordan kan jeg sende $ IP og $ NUMDISP som en variabel til et andet forventet script? (dette derfor synes jeg det er anderledes end det andet spørgsmål)

Kommentarer

Svar

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

Umm … nej.

Dybest set ønsker du for begge programmer til at læse dit script og “gøre det rigtige” med hensyn til hver linje. Bortset fra problemerne mellem synkronisering af scriptudførelsen mellem tolkerne, er det let at se, at dette er umuligt i det øjeblik, vi har en linje, der kan være en gyldig kommando på begge sprog.

Overvej noget lignende i dit eksempel.

set Username "user" 

Det er faktisk gyldigt i både shell og i et forventet script. I skallen indstiller den positionsparametrene $1 og $2 til Username og user, henholdsvis. I expect tildeler den noget andet. Hvilken skal den gøre?

Enten opdele dit forventede script til en anden fil og kalde det fra shell-scriptet, eller brug det faktum, at Expect kører på TCL, hvilket skulle tillade at lave sløjfer og IO i sig selv.


Heldigvis i dette tilfælde er der bare et forventet uddrag indeholdt i en shell-loop i din anden kodeblok.

Så lav et shell-script

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

og et forventet script skal ringe fra shell-scriptet:

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

Kommentarer

  • @cesar, der er måder at placere et forventet script inde i et shell-script, men der er altid hovedpine omkring citering og variabler. Dette er den reneste måde.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *