bash en verwacht in hetzelfde script?

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

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *