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 sich über Telnet mit der unter $ IP gespeicherten IP verbindet und die Ausgabe "show version" speichert.
Ich habe es damit 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 nicht verwenden und erwarten?
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)
bash
shell-script
scripting
expect
Cesar Alejandro Villegas Yepez
quelle
quelle
expect
kann eine CSV-Datei lesen, wie ich in unix.stackexchange.com/questions/350338/…Antworten:
Ähm nein.
Grundsätzlich möchten Sie, dass beide Programme Ihr Skript lesen und in jeder Zeile "das Richtige 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 Ihrem Beispiel.
Es ist tatsächlich sowohl in der Shell als auch in einem Expect-Skript gültig. In der Shell werden die Positionsparameter
$1
bzw.$2
aufUsername
und festgelegtuser
. Darinexpect
wird etwas anderes zugewiesen. Welches sollte es tun?Teilen Sie Ihr Expect-Skript entweder 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 in sich selbst ausgeführt werden sollten.
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
und ein Expect-Skript, das vom Shell-Skript aufgerufen wird:
quelle