bash och förvänta dig i samma skript?

Jag försöker koda ett skript som tar IP-adresser från en .csv-fil och telnetar enheten för att fånga ”visa version” -kommandoutput.

Hittills har jag kodat det här:

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

Jag måste slutföra for-loop så att den ansluts via telnet till IP lagrad till $ IP och spara ”visa version” -utdata.

Jag har försökt med detta:

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 fungerade inte.

Är det orsaken som jag inte kan använda bash och förvänta mig?

Om det är anledningen .. hur kan jag skicka $ IP och $ NUMDISP som en variabel till ett annat förväntningsskript? (detta är därför jag tycker att det är annorlunda än den andra frågan)

Kommentarer

Svar

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

Umm … nej.

I grund och botten vill du ha för båda program för att läsa ditt manus och ”göra rätt” angående varje rad. Bortsett från problemen mellan att synkronisera skriptkörningen mellan tolkarna är det lätt att se att detta är omöjligt när vi har en rad som kan vara ett giltigt kommando på båda språken.

Tänk på något liknande i ditt exempel.

set Username "user" 

Det är faktiskt giltigt i både skalet och i ett förväntat skript. I skalet ställer det in positionsparametrarna $1 och $2 till Username och user. I expect tilldelas det något annat. Vilken bör den göra?

Dela antingen ditt förväntade skript till en annan fil och ring det från skalskriptet, eller använd det faktum att Expect körs på TCL vilket skulle göra det möjligt att göra loopar och IO i sig.


Lyckligtvis i det här fallet finns det bara ett förväntat utdrag som finns i en skalslinga i ditt andra kodblock.

Så gör ett skalskript

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

och ett förväntat skript ringer från skalskriptet:

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

Kommentarer

  • @cesar, det finns sätt att placera ett förväntat skript i ett skalskript, men det finns alltid huvudvärk kring citat och variabler. Detta är det renaste sättet.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *