Încerc să codez un script care ia adrese IP dintr-un fișier .csv și telnetează dispozitivul pentru a prinde ieșirea comenzii „show version”.
Până acum am codificat acest lucru:
#!/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
Am nevoie să completez bucla for, astfel încât să se conecteze prin telnet la IP-ul stocat la $ IP și salvați rezultatul „arată versiunea”.
Am încercat cu acest lucru:
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
dar nu a funcționat.
Este această cauză, nu pot folosi bash și aștept?
În cazul în care acesta este motivul .. cum pot trimite $ IP și $ NUMDISP ca variabilă într-un alt script expect? de aceea cred că este diferit de cealaltă întrebare)
Comentarii
Răspuns
#!/bin/bash #!/usr/bin/expect -f
Umm … nu.
Practic doriți atât pentru programe pentru a vă citi scriptul și pentru a „face ceea ce trebuie” cu privire la fiecare linie. În afară de problemele dintre sincronizarea executării scriptului între interpreți, este ușor de văzut că acest lucru este imposibil în momentul în care avem o linie care ar putea fi o comandă validă în oricare dintre limbi. exemplul dvs.
set Username "user"
De fapt, este valabil atât în shell, cât și într-un script expect. În shell, setează parametrii de poziție $1
și $2
la Username
și user
, respectiv. În expect
atribuie altceva. Pe care ar trebui să o facă?
Fie împărțiți scriptul dvs. expect într-un fișier diferit și apelați-l din scriptul shell, fie folosiți faptul că Expect rulează pe TCL, care ar trebui să permită efectuarea de bucle și IO în sine.
Din fericire, în acest caz, există doar un fragment de așteptare conținut într-o buclă de shell din al doilea bloc de cod.
Deci, creați un script de shell
#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done
și un script de asteptare va apela din scriptul shell:
#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ...
Comentarii
- @cesar, există modalități de a pune un script expect într-un script shell, dar există întotdeauna dureri de cap în jurul citatelor și variabilelor. Acesta este cel mai curat mod.
expect
poate citi un fișier CSV, așa cum am arătat în unix.stackexchange.com/questions/350338/…