Espere o tempo limite, nos scripts do Bash

13

Como adiciono tempo limite para "expect" no script a seguir? Eu quero defini-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"
Bijo
fonte

Respostas:

13

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

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\"
")
DerfK
fonte
2

De acordo com o seguinte extrato da página do manual for expect:

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

aguarda até que um dos padrões corresponda à saída de um processo gerado, um período de tempo especificado tenha passado ou um final de arquivo seja visto. Se o corpo final estiver vazio, ele poderá 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 implicitamente usados ​​após quaisquer outros padrões.

Se os argumentos para toda a declaração de expectativa exigirem mais de uma linha, todos os argumentos poderão ser "agrupados" em uma, para evitar o término de cada linha com uma barra invertida. Nesse caso, as substituições usuais de Tcl ocorrerão apesar das chaves.

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

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

mdpc
fonte
1

@DerfK respondeu à sua pergunta. Eu refatoraria 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"
Glenn Jackman
fonte