Назад | Перейти на главную страницу

Ожидайте тайм-аут в сценариях Bash

Как мне добавить тайм-аут для "ожидать" в следующем скрипте? Я хочу установить его как 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"

Тайм-аут по умолчанию для 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\"
")

Согласно следующему отрывку из страницы руководства для expect:

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

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

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

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

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