bash a očekávat ve stejném skriptu?

Snažím se kódovat skript, který bere IP adresy ze souboru .csv a telnetuje zařízení, aby zachytilo výstup příkazu „show version“.

Zatím jsem to kódoval:

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

Musím dokončit smyčku for, aby se připojil přes telnet k IP uložené v $ IP a uložit výstup „zobrazit verzi“.

Zkoušel jsem to:

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 

, ale nefungovalo to.

Je to příčina, že nemohu použít bash a expect?

V případě, že je to důvod … jak mohu poslat $ IP a $ NUMDISP jako proměnnou do jiného skriptu expect? (toto proto si myslím, že je to jiné než druhá otázka)

Komentáře

Odpověď

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

Hmm … ne.

V zásadě chcete obojí programy ke čtení skriptu a „udělejte správnou věc“ ohledně každého řádku. Kromě problémů mezi synchronizací provádění skriptu mezi tlumočníky je snadné vidět, že je to nemožné v okamžiku, kdy máme řádek, který by mohl být platným příkazem v obou jazycích.

Zvažte něco takového v váš příklad.

set Username "user" 

Je to skutečně platné jak v shellu, tak v skriptu expect. V shellu nastavuje poziční parametry $1 a $2 na Username a user V expect přiřazuje něco jiného. Který z nich by to měl udělat?

Buď rozdělte svůj očekávaný skript na jiný soubor a zavolejte jej ze skriptu prostředí, nebo použijte skutečnost, že Expect běží na TCL, což by mělo umožnit dělat smyčky a IO samo o sobě.


Naštěstí v tomto případě existuje pouze očekávaný fragment obsažený ve smyčce shellu ve vašem druhém bloku kódu.

Takže vytvořte shell skript

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

a očekává se, že skript bude volat ze skriptu prostředí:

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

Komentáře

  • @cesar, existují způsoby, jak umístit očekávaný skript do skriptu prostředí, ale kolem citací a proměnných jsou vždy bolesti hlavy. Toto je nejčistší způsob.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *