bash ja odottaa samalla käsikirjoituksella?

Yritän koodata komentosarjaa, joka ottaa IP-osoitteet .csv-tiedostosta ja telnetaa laitteen kiinni ”näytä versio” -komennon ulostulon saamiseksi.

Olen toistaiseksi koodannut tämän:

#!/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 

Minun on täytettävä for-silmukka, jotta se muodostaa yhteyden telnetin kautta IP-osoitteeseen, joka on tallennettu osoitteeseen $ IP ja tallenna ”näytä versio” -lähtö.

Olen kokeillut tätä:

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 

mutta se ei toiminut.

Onko tämä syy en voi käyttää bashia ja odottaa?

Jos se on syy .. miten voin lähettää $ IP: n ja $ NUMDISP: n muuttujana toiseen odotuskomentoon? (tämä siksi mielestäni se on erilainen kuin toinen kysymys)

Kommentit

Vastaa

#!/bin/bash #!/usr/bin/expect -f 

Umm … ei.

Periaatteessa haluat molemmat ohjelmia lukemaan komentosarjasi ja ”tekemään oikein” jokaiselle riville. Sen lisäksi, että skriptien suoritus synkronoidaan tulkkien välillä, on helppo nähdä, että tämä on mahdotonta, kun meillä on rivi, joka voi olla kelvollinen komento kummallakin kielellä.

Harkitse jotain tällaista esimerkkisi.

set Username "user" 

Se on oikeastaan voimassa sekä kuoressa että odotuskomentosarjassa. Kuoressa se asettaa sijaintiparametrit $1 ja $2 arvoon Username ja user. Kohdassa expect se määrittää jotain muuta. Minkä sen pitäisi tehdä?

Joko odottaa komentosarjasi toiseksi tiedostoksi ja kutsua sitä shell-komentosarjassa, tai käyttää sitä tosiasiaa, että Expect toimii TCL: llä, mikä sallii silmukoiden ja IO: n tekemisen itsessään.


Onneksi tässä tapauksessa toisen koodilohkon shell-silmukassa on vain odotettavissa oleva katkelma.

Tee siis shell-komentosarja

#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done 

ja odottaa komentosarjan kutsuvan komentosarjan komentosarjalta:

#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ... 

Kommentit

  • @cesar, on olemassa tapoja laittaa odottava komentosarja komentosarjan sisälle, mutta lainausten ja muuttujien ympärillä on aina päänsärkyä. Tämä on puhtain tapa.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *