Olyan szkriptet próbálok kódolni, amely egy .csv fájl IP-címét veszi fel, és az eszközt telnet segítségével elkapja a “show version” parancs kimenetét.
Eddig ezt kódoltam:
#!/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
Ki kell töltenem a for ciklust, hogy telneten keresztül csatlakozzon a $ IP címen tárolt IP-hez és mentse a “show version” kimenetet.
Próbáltam ezzel:
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
de nem működött.
Ez az oka annak, hogy nem tudom használni a bash-t és a várakozást?
Ha ez az oka .. hogyan küldhetem a $ IP és a $ NUMDISP-t változóként egy másik várakozási szkriptbe? ezért gondolom, hogy ez más, mint a másik kérdés)
Megjegyzések
Válasz
#!/bin/bash #!/usr/bin/expect -f
Umm … nem.
Alapvetően mindkét programokat olvasni a szkriptet, és minden sorban “helyesen cselekedni”. A szkript végrehajtásának tolmácsok közötti szinkronizálása közötti problémákon kívül könnyen belátható, hogy ez lehetetlen abban a pillanatban, amikor van egy olyan sorunk, amely bármelyik nyelven érvényes parancs lehet.
Fontoljon meg ilyesmit a a te példád.
set Username "user"
Ez valójában érvényes a shellben és az várakozási szkriptben is. A héjban a $1
és $2
Username
és user
. A expect
szakaszban mást rendel hozzá. Melyiket tegye?
Vagy ossza fel az várt parancsfájlt egy másik fájlra, és hívja meg a shell parancsfájlból, vagy használja azt a tényt, hogy az Expect TCL-n fut, aminek lehetővé kell tennie a ciklusok és az IO önmagában történő végrehajtását. / p>
Ebben az esetben szerencsére csak egy várható kódrészlet található a második kódblokk héjkörében.
Tehát készítsen shell parancsfájlt
#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done
és egy várható szkript, amelyet a shell parancsfájlból kell meghívni:
#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ...
Megjegyzések
- @cesar, van mód arra, hogy egy várakozó szkriptet egy shell szkriptbe helyezzen, de az idézetek és a változók körül mindig fáj a fej. Ez a legtisztább módszer.
expect
képes CSV-fájl olvasására, amint azt a unix.stackexchange.com/questions/350338/…