Bash und erwarten im gleichen Skript?

Ich versuche, ein Skript zu codieren, das IP-Adressen aus einer CSV-Datei entnimmt und das Gerät telnet, um die Befehlsausgabe „show version“ abzufangen.

Bisher habe ich Folgendes codiert:

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

Ich muss die for-Schleife abschließen, damit sie über Telnet mit der bei $ IP gespeicherten IP verbunden wird und speichern Sie die Ausgabe „show version“.

Ich habe Folgendes versucht:

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 

, aber es hat nicht funktioniert.

Kann ich Bash und Expect nicht verwenden?

Falls dies der Grund ist, wie kann ich $ IP und $ NUMDISP als Variable in ein anderes Expect-Skript senden? Deshalb denke ich, dass es anders ist als die andere Frage.

Kommentare

Antwort

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

Umm … nein.

Grundsätzlich möchten Sie für beide die Programme, um Ihr Skript zu lesen und in jeder Zeile „das Richtige zu tun“. Abgesehen von den Problemen zwischen der Synchronisierung der Skriptausführung zwischen den Interpreten ist es leicht zu erkennen, dass dies unmöglich ist, sobald wir eine Zeile haben, die in beiden Sprachen ein gültiger Befehl sein könnte.

Betrachten Sie so etwas in Ihr Beispiel.

set Username "user" 

Es ist tatsächlich sowohl in der Shell als auch in einem Expect-Skript gültig. In der Shell werden die Positionsparameter $1 und $2 auf Username und user. In expect wird etwas anderes zugewiesen. Welches sollte es tun?

Teilen Sie entweder Ihr Expect-Skript in eine andere Datei auf und rufen Sie es aus dem Shell-Skript auf, oder verwenden Sie die Tatsache, dass Expect auf TCL ausgeführt wird, wodurch Schleifen und E / A an sich ausgeführt werden können.


Glücklicherweise ist in diesem Fall nur ein Expect-Snippet in einer Shell-Schleife in Ihrem zweiten Codeblock enthalten.

Erstellen Sie also ein Shell-Skript

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

und ein Expect-Skript, das vom Shell-Skript aufgerufen wird:

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

Kommentare

  • @cesar, es gibt Möglichkeiten, ein Expect-Skript in ein Shell-Skript einzufügen, aber es gibt immer Kopfschmerzen bei Anführungszeichen und Variablen. Dies ist der sauberste Weg.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.