bash i spodziewać się w tym samym skrypcie?

Próbuję zakodować skrypt, który pobiera adresy IP z pliku .csv i telnetować urządzenie, aby przechwycić dane wyjściowe polecenia „show version”.

Do tej pory zakodowałem to:

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

Muszę zakończyć pętlę for, aby połączyć się przez telnet z adresem IP przechowywanym w $ IP i zapisz wyjście „show version”.

Próbowałem z tym:

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 

ale to nie działało.

Czy to jest przyczyna, dla której nie mogę używać basha i oczekiwać?

W przypadku, gdy to jest powód … jak mogę wysłać $ IP i $ NUMDISP jako zmienne do innego skryptu oczekiwania? (to dlatego uważam, że jest inne niż pozostałe pytanie)

Komentarze

Odpowiedź

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

Umm … nie.

Zasadniczo potrzebujesz obu programy do czytania skryptu i „postępują właściwie” w odniesieniu do każdej linii. Pomijając problemy między synchronizacją wykonywania skryptu między interpreterami, łatwo zauważyć, że jest to niemożliwe w chwili, gdy mamy wiersz, który mógłby być prawidłowym poleceniem w obu językach.

Rozważ coś takiego w Twój przykład.

set Username "user" 

W rzeczywistości działa to zarówno w powłoce, jak i w oczekiwanym skrypcie. W powłoce ustawia parametry pozycyjne $1 i $2 na Username i user odpowiednio. W expect przypisuje coś innego. Który powinien zrobić?

Albo podziel swój skrypt oczekiwania na inny plik i wywołaj go ze skryptu powłoki, albo użyj faktu, że Expect działa na TCL, co powinno pozwolić na wykonywanie pętli i operacji we / wy.


Na szczęście w tym przypadku w drugim bloku kodu w pętli powłoki znajduje się tylko fragment kodu oczekiwanego.

Stwórz więc skrypt powłoki

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

i oczekiwany skrypt wywołania ze skryptu powłoki:

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

Komentarze

  • @cesar, są sposoby na umieszczenie skryptu oczekiwania wewnątrz skryptu powłoki, ale zawsze są bóle głowy związane z cytowaniem i zmiennymi. To jest najczystszy sposób.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *