Aspettati il ​​timeout, negli script Bash


13

Come faccio ad aggiungere il timeout per "aspettarsi" nel seguente script? Voglio impostarlo come 120 secondi.

#!/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"

Risposte:


13

Il timeout predefinito per expectè 10 secondi in base alla sua pagina man. Per cambiarlo in 120 secondi, prima spawn ssh $USER@$HOST, aggiungi la linea

set timeout 120

per fare questo

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

2

Secondo il seguente estratto della pagina man per aspettarsi:

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

attende fino a quando uno dei modelli corrisponde all'output di un processo generato, è trascorso un periodo di tempo specificato o viene visualizzata una fine del file. Se il corpo finale è vuoto, può essere omesso.

I pattern del comando più recente prevedono sono usati implicitamente prima di qualsiasi altro pattern. I pattern del più recente comando wait_after vengono implicitamente utilizzati dopo altri pattern.

Se gli argomenti dell'intera istruzione prevedono richiedono più di una riga, è possibile "racchiudere" tutti gli argomenti in uno in modo da evitare di terminare ogni riga con una barra rovesciata. In questo caso, si verificheranno le solite sostituzioni Tcl nonostante le parentesi graffe.

Se un modello è la parola chiave eof, il corpo corrispondente viene eseguito alla fine del file. Se un pattern è il timeout della parola chiave, il body corrispondente viene eseguito al timeout. Se non viene utilizzata alcuna parola chiave di timeout, al momento del timeout viene eseguita un'azione nulla implicita. Il periodo di timeout predefinito è 10 secondi ma può essere impostato, ad esempio, su 30, dal comando "imposta timeout 30". Un timeout infinito può essere designato dal valore -1. Se un modello è la parola chiave predefinita, il corpo corrispondente viene eseguito al timeout o alla fine del file.

Se un modello corrisponde, viene eseguito il corpo corrispondente. prevede restituisce il risultato del corpo (o la stringa vuota se non è stato trovato alcun motivo). Nel caso in cui più schemi corrispondano, quello che appare per primo viene utilizzato per selezionare un corpo. ... "


1

@DerfK ha risposto alla tua domanda. Riformulerei la tua sceneggiatura per manutenzione però:

#!/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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.