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
- Don ' t Mischen Sie die Sprachen.
expect
kann eine CSV-Datei lesen, wie ich in unix.stackexchange.com/questions/350338/… - Mögliches Duplikat von Multiple telnet co nnection in Expect while-Schleife
- @thrig das OP hat offensichtlich ' nicht das Gefühl, dass ' sa betrogen, da sie ' gerade diese Frage gestellt haben.
- Ich habe beide Fragen gestellt, ich denke, das ist ein bisschen anders als die anderen.
- stackoverflow.com/questions/36284861/…
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.