Esperar tempo limite, no script Bash

11

Como adiciono tempo limite para "esperar" no script a seguir? Eu quero configurá-lo 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"
    
por Bijo 14.07.2011 / 00:39

3 respostas

11

O tempo limite padrão para expect é de 10 segundos, de acordo com a manpage. Para alterá-lo para 120 segundos, antes de spawn ssh $USER@$HOST , adicione a linha

set timeout 120

para fazer isso

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

De acordo com o seguinte extrato da página do manual para esperar:

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

aguarda até que um dos padrões corresponda à saída de um processo gerado, que um período de tempo especificado tenha passado ou que um fim de arquivo seja visto. Se o corpo final estiver vazio, pode ser omitido.

Os padrões do comando expect_before mais recente são implicitamente usados antes de qualquer outro padrão. Os padrões do comando expect_after mais recente são usados implicitamente depois de qualquer outro padrão.

Se os argumentos para toda a instrução expect exigirem mais de uma linha, todos os argumentos podem ser "colocados" em um, para evitar terminar cada linha com uma barra invertida. Neste caso, as substituições usuais de Tcl ocorrerão apesar das chaves.

Se um padrão for a palavra-chave eof, o corpo correspondente será executado no final do arquivo. Se um padrão for o tempo limite da palavra-chave, o corpo correspondente será executado no tempo limite. Se nenhuma palavra-chave timeout for usada, uma ação nula implícita será executada no tempo limite. O período de tempo limite padrão é de 10 segundos, mas pode ser definido, por exemplo, para 30, pelo comando "set timeout 30". Um tempo limite infinito pode ser designado pelo valor -1. Se um padrão for a palavra-chave default, o corpo correspondente será executado no tempo limite ou no final do arquivo.

Se um padrão corresponder, o corpo correspondente será executado. esperar retorna o resultado do corpo (ou a string vazia se nenhum padrão for correspondido). No caso de vários padrões coincidirem, o que aparece primeiro é usado para selecionar um corpo. ... "

    
por 14.07.2011 / 01:14
1

@DerfK respondeu à sua pergunta. Eu refatorei seu script para manutenção:

#!/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"
    
por 14.07.2011 / 15:18

Tags