Ожидайте тайм-аут, в скриптах Bash

13

Как добавить время ожидания для ожидаемого в следующем сценарии? Я хочу установить его на 120 секунд.

#!/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
источник

Ответы:

13

Время ожидания по умолчанию expectсоставляет 10 секунд в соответствии с его страницей руководства. Чтобы изменить его на 120 секунд, прежде чем spawn ssh $USER@$HOSTдобавить строку

set timeout 120

сделать это

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
источник
2

Согласно следующему фрагменту справочной страницы для ожидаемого:

"ожидайте [[-opts] pat1 body1] ... [-opts] patn [bodyn]

ожидает, пока один из шаблонов не совпадет с выводом порожденного процесса, пройдет определенный период времени или будет замечен конец файла. Если окончательное тело пусто, оно может быть опущено.

Шаблоны из самой последней команды wait_before неявно используются перед любыми другими шаблонами. Шаблоны из самой последней команды wait_after неявно используются после любых других шаблонов.

Если для аргументов всего оператора ожидаемого требуется более одной строки, все аргументы могут быть «заключены» в одну, чтобы избежать завершения каждой строки обратной косой чертой. В этом одном случае обычные замены Tcl будут происходить, несмотря на скобки.

Если шаблон является ключевым словом eof, соответствующее тело выполняется в конце файла. Если шаблон является ключевым словом timeout, соответствующее тело выполняется по истечении времени ожидания. Если ключевое слово timeout не используется, по истечении времени ожидания выполняется неявное нулевое действие. Период ожидания по умолчанию составляет 10 секунд, но может быть установлен, например, 30, командой «установить время ожидания 30». Бесконечное время ожидания может быть обозначено значением -1. Если шаблон является ключевым словом по умолчанию, соответствующее тело выполняется по истечении времени ожидания или конца файла.

Если шаблон соответствует, то выполняется соответствующее тело. Ожидайте, возвращает результат тела (или пустую строку, если шаблон не соответствует). В случае совпадения нескольких шаблонов один, который появляется первым, используется для выбора тела. ... "

Якорь,
источник
1

@DerfK ответил на ваш вопрос. Я бы реорганизовал ваш скрипт для обслуживания, хотя:

#!/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"
Гленн Джекман
источник