Ik probeer een script te coderen dat IP-adressen uit een .csv-bestand haalt en het apparaat telnet om de uitvoer van de “show version” -opdracht op te vangen.
Tot dusver heb ik dit gecodeerd:
#!/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
Ik moet de for-lus voltooien zodat deze via telnet verbinding maakt met het IP-adres dat is opgeslagen op $ IP en sla “show version” -uitvoer op.
Ik heb dit geprobeerd:
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
maar het werkte niet.
Is dit de oorzaak dat ik bash en verwacht niet kan gebruiken?
In het geval dat dat de reden is … hoe kan ik $ IP en $ NUMDISP als een variabele naar een ander verwacht script sturen? (dit daarom denk ik dat het “anders is dan de andere vraag)
Opmerkingen
- Don ' t mix de talen,
expect
kan een CSV-bestand lezen, zoals ik heb laten zien in unix.stackexchange.com/questions/350338/… - Mogelijk duplicaat van Meerdere telnet co nnection in Expect while loop
- @thrig the OP heeft duidelijk geen ' het gevoel dat ' sa dupe omdat ze ' deze vraag zojuist hebben gesteld.
- Ik heb beide vragen gemaakt, ik denk dat dit een beetje anders is dan de andere.
- stackoverflow.com/questions/36284861/…
Antwoord
#!/bin/bash #!/usr/bin/expect -f
Umm … nee.
In principe wil je voor beide programmas om uw script te lezen, en “doe het juiste” met betrekking tot elke regel. Afgezien van de problemen tussen het synchroniseren van de scriptuitvoering tussen de tolken, is het gemakkelijk in te zien dat dit onmogelijk is op het moment dat we een regel hebben die een geldig commando zou kunnen zijn in beide talen.
Overweeg zoiets in uw voorbeeld.
set Username "user"
Het is feitelijk geldig in zowel de shell als in een verwacht script. In de shell worden de positionele parameters $1
en $2
ingesteld op Username
en user
, respectievelijk. In expect
wijst het iets anders toe. Welke moet het doen?
Splits je verwacht script in een ander bestand en noem het vanuit het shell-script, of gebruik het feit dat Expect op TCL draait, wat het doen van loops en IO op zichzelf zou moeten toestaan.
Gelukkig is er in dit geval alleen een verwacht fragment in een shell-lus in je tweede codeblok.
Dus, maak een shell-script
#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done
en een verwacht script dat aanroept vanuit het shellscript:
#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ...
Reacties
- @cesar, er zijn manieren om een verwacht script in een shell-script te plaatsen, maar er zijn altijd hoofdpijn rond citaten en variabelen. Dit is de schoonste manier.