Spodziewaj się limitu czasu w skryptach Bash

13

Jak dodać limit czasu dla „expect” w poniższym skrypcie? Chcę ustawić to na 120 sekund.

#!/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
źródło

Odpowiedzi:

13

Domyślny limit czasu expectwynosi 10 sekund, zależnie od strony podręcznika. Aby zmienić go na 120 sekund, wcześniej spawn ssh $USER@$HOSTdodaj linię

set timeout 120

zrobić to

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
źródło
2

Zgodnie z poniższym wyciągiem ze strony man for expect:

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

czeka, aż jeden z wzorców pasuje do wyniku odrodzonego procesu, upłynął określony czas lub widać koniec pliku. Jeśli końcowe ciało jest puste, można je pominąć.

Wzorce z najnowszej komendy expect_before są domyślnie używane przed innymi wzorami. Wzorce z najnowszej komendy expect_after są domyślnie używane po wszelkich innych wzorcach.

Jeśli argumenty całej instrukcji expect wymagają więcej niż jednego wiersza, wszystkie argumenty mogą zostać „połączone” w jeden, aby uniknąć kończenia każdego wiersza odwrotnym ukośnikiem. W tym jednym przypadku, pomimo nawiasów klamrowych, nastąpi zwykłe podstawienie Tcl.

Jeśli wzorzec jest słowem kluczowym eof, odpowiednia treść jest wykonywana na końcu pliku. Jeśli wzorzec jest limitem czasu słowa kluczowego, odpowiednie ciało jest wykonywane po upływie limitu czasu. Jeśli nie zostanie użyte słowo kluczowe limitu czasu, po upływie limitu czasu zostanie wykonana niejawna akcja zerowa. Domyślny limit czasu wynosi 10 sekund, ale można go ustawić na przykład na 30, za pomocą polecenia „ustaw limit 30”. Nieskończony limit czasu może być oznaczony wartością -1. Jeśli wzorzec jest domyślnym słowem kluczowym, odpowiednie ciało jest wykonywane po przekroczeniu limitu czasu lub na końcu pliku.

Jeśli wzorzec pasuje, wówczas wykonywane jest odpowiednie ciało. expect zwraca wynik treści (lub pustego łańcucha, jeśli żaden wzór nie pasuje). W przypadku dopasowania wielu wzorów, ten, który pojawia się jako pierwszy, służy do wybierania treści. ... ”

mdpc
źródło
1

@DerfK odpowiedział na twoje pytanie. Zmienilbym twój skrypt do konserwacji:

#!/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
źródło