Attendez-vous à un délai d'expiration, dans les scripts Bash

13

Comment ajouter un délai d'attente pour "attendre" dans le script suivant? Je veux le fixer à 120 secondes.

#!/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
la source

Réponses:

13

Le délai d'expiration par défaut expectest de 10 secondes selon sa page de manuel. Pour le changer à 120 secondes, avant spawn ssh $USER@$HOST, ajoutez la ligne

set timeout 120

faire cela

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
la source
2

Selon l'extrait suivant de la page de manuel pour expect:

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

attend que l'un des modèles corresponde à la sortie d'un processus généré, qu'une période spécifiée se soit écoulée ou qu'une fin de fichier soit vue. Si le corps final est vide, il peut être omis.

Les modèles de la commande expect_before la plus récente sont implicitement utilisés avant tout autre modèle. Les modèles de la commande expect_after la plus récente sont implicitement utilisés après tout autre modèle.

Si les arguments de la totalité de l'instruction expect nécessitent plusieurs lignes, tous les arguments peuvent être "contreventés" en une seule afin d'éviter de terminer chaque ligne par une barre oblique inverse. Dans ce cas, les substitutions Tcl habituelles se produiront malgré les accolades.

Si un modèle est le mot clé eof, le corps correspondant est exécuté à la fin du fichier. Si un modèle est le mot-clé timeout, le corps correspondant est exécuté lors du timeout. Si aucun mot clé timeout n'est utilisé, une action null implicite est exécutée lors du timeout. Le délai d'expiration par défaut est de 10 secondes mais peut être réglé, par exemple sur 30, par la commande "set timeout 30". Un délai infini peut être désigné par la valeur -1. Si un modèle est le mot-clé par défaut, le corps correspondant est exécuté à l'expiration ou à la fin du fichier.

Si un modèle correspond, le corps correspondant est exécuté. attend renvoie le résultat du corps (ou la chaîne vide si aucun modèle ne correspond). Dans le cas où plusieurs motifs correspondent, celui qui apparaît en premier est utilisé pour sélectionner un corps. ... "

mdpc
la source
1

@DerfK a répondu à votre question. Je voudrais cependant refactoriser votre script pour la maintenance:

#!/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
la source