Bash und erwarten im gleichen Skript?

9

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)

Cesar Alejandro Villegas Yepez
quelle
2
Mischen Sie nicht die Sprachen, expectkann eine CSV-Datei lesen, wie ich in unix.stackexchange.com/questions/350338/…
Thrig
1
Mögliches Duplikat der Mehrfach-Telnet-Verbindung in Expect while loop
thrig
@thrig das OP fühlt sich offensichtlich nicht betrogen, da sie gerade diese Frage gestellt haben.
Terdon
Ich habe beide Fragen gestellt, ich denke, das ist ein bisschen anders als das andere.
Cesar Alejandro Villegas Yepez

Antworten:

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

Ä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.

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 $1bzw. $2auf Usernameund festgelegt user. Darin expectwird 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

#!/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"
...
ilkkachu
quelle
1
@cesar, es gibt Möglichkeiten, ein Expect-Skript in ein Shell-Skript einzufügen, aber es gibt immer Kopfschmerzen beim Zitieren und bei Variablen. Dies ist der sauberste Weg.
Glenn Jackman