Esperar tiempo de espera, en scripts de Bash

13

¿Cómo agrego tiempo de espera para "esperar" en el siguiente script? Quiero configurarlo como 120 segundos.

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

Respuestas:

13

El tiempo de espera predeterminado expectes de 10 segundos según su página de manual. Para cambiarlo a 120 segundos, antes spawn ssh $USER@$HOST, agregue la línea

set timeout 120

para hacer esto

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
fuente
2

De acuerdo con el siguiente extracto de la página del manual para esperar:

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

espera hasta que uno de los patrones coincida con la salida de un proceso generado, haya pasado un período de tiempo especificado o se vea el final del archivo. Si el cuerpo final está vacío, puede omitirse.

Los patrones del comando expect_before más reciente se usan implícitamente antes que cualquier otro patrón. Los patrones del comando expect_after más reciente se usan implícitamente después de cualquier otro patrón.

Si los argumentos de toda la declaración de espera requieren más de una línea, todos los argumentos pueden estar "entre paréntesis" en uno para evitar terminar cada línea con una barra diagonal inversa. En este caso, las sustituciones habituales de Tcl ocurrirán a pesar de las llaves.

Si un patrón es la palabra clave eof, el cuerpo correspondiente se ejecuta al final del archivo. Si un patrón es el tiempo de espera de la palabra clave, el cuerpo correspondiente se ejecuta en el tiempo de espera. Si no se utiliza una palabra clave de tiempo de espera, se ejecuta una acción nula implícita al tiempo de espera. El período de tiempo de espera predeterminado es de 10 segundos, pero se puede establecer, por ejemplo, en 30, mediante el comando "establecer tiempo de espera 30". Un tiempo de espera infinito puede ser designado por el valor -1. Si un patrón es la palabra clave predeterminada, el cuerpo correspondiente se ejecuta en el tiempo de espera o al final del archivo.

Si un patrón coincide, se ejecuta el cuerpo correspondiente. expect devuelve el resultado del cuerpo (o la cadena vacía si no coincide ningún patrón). En el caso de que coincidan varios patrones, el que aparece primero se usa para seleccionar un cuerpo. ... "

mdpc
fuente
1

@DerfK ha respondido tu pregunta. Sin embargo, refactorizaría su script para mantenimiento:

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