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.
expect
może czytać plik CSV, tak jak pokazałem w unix.stackexchange.com/questions/350338/…