Erwarten Sie eine Zeitüberschreitung in Bash-Skripten

13

Wie füge ich im folgenden Skript eine Zeitüberschreitung für "erwarten" hinzu? Ich möchte es als 120 Sekunden einstellen.

#!/bin/bash
HOST="localhost"
USER="myuname"
PASS="mypassword"

VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

echo "==============="
echo "$VAR"
Bijo
quelle

Antworten:

13

Das Standard-Timeout für expectbeträgt laut Manpage 10 Sekunden. Fügen Sie spawn ssh $USER@$HOSTdie Zeile hinzu, um sie auf 120 Sekunden zu ändern

set timeout 120

um das zu machen

VAR=$(expect -c "
set timeout 120
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")
DerfK
quelle
2

Nach folgendem Auszug aus der Manpage für Expect:

"Erwarte [[-opts] pat1 body1] ... [-opts] patn [bodyn]

Wartet, bis eines der Muster mit der Ausgabe eines gespawnten Prozesses übereinstimmt, ein bestimmter Zeitraum verstrichen ist oder ein Dateiende angezeigt wird. Wenn der endgültige Körper leer ist, kann er weggelassen werden.

Muster aus dem letzten Befehl expect_before werden implizit vor allen anderen Mustern verwendet. Muster aus dem letzten Befehl expect_after werden implizit nach allen anderen Mustern verwendet.

Wenn die Argumente für die gesamte expect-Anweisung mehr als eine Zeile erfordern, können alle Argumente in eine "Klammer" gesetzt werden, um zu vermeiden, dass jede Zeile mit einem Backslash abgeschlossen wird. In diesem einen Fall treten die üblichen Tcl-Substitutionen trotz der Klammern auf.

Wenn ein Muster das Schlüsselwort eof ist, wird der entsprechende Text am Ende der Datei ausgeführt. Wenn ein Muster das Schlüsselwort timeout ist, wird der entsprechende Text beim Timeout ausgeführt. Wenn kein Schlüsselwort timeout verwendet wird, wird beim Timeout eine implizite Null-Aktion ausgeführt. Die Standard-Zeitüberschreitungsperiode beträgt 10 Sekunden, kann jedoch beispielsweise durch den Befehl "set timeout 30" auf 30 gesetzt werden. Eine unendliche Zeitüberschreitung kann durch den Wert -1 angegeben werden. Wenn ein Muster das Standardschlüsselwort ist, wird der entsprechende Text entweder bei Zeitüberschreitung oder Dateiende ausgeführt.

Wenn ein Muster übereinstimmt, wird der entsprechende Body ausgeführt. expect gibt das Ergebnis des Rumpfes zurück (oder die leere Zeichenkette, wenn kein Muster gefunden wurde). Für den Fall, dass mehrere Muster übereinstimmen, wird das zuerst angezeigte zur Auswahl eines Körpers verwendet. ... "

mdpc
quelle
1

@DerfK hat Ihre Frage beantwortet. Ich würde Ihr Skript jedoch für die Wartung überarbeiten:

#!/bin/bash
export HOST="localhost"
export USER="myuname"
export PASS="mypassword"

script=<<'END_OF_SCRIPT'
    set timeout 120
    spawn ssh $env(USER)@$env(HOST)
    expect "password:"
    send "$env(PASS)\r"
    expect "\$"
    send "ls\r"
    expect -re "$env(USER).*"
    send "logout"
    expect eof
END_OF_SCRIPT

VAR=$(expect -c "$script")

echo "==============="
echo "$VAR"
Glenn Jackman
quelle