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.
expect
umí číst soubor CSV, jako jsem ukázal v unix.stackexchange.com/questions/350338/…