Запишите вывод команды Expect

Вопрос или проблема

Я создал приведенный ниже скрипт expect и мне нужно зафиксировать вывод этого скрипта.

SOURCE_FILE=`ls -l *.txt --time-style=+%D | grep ${DT} | grep -v '^d' | awk '{print $NF}' `
if [ -n "${SOURCE_FILE}" ]
then
    cp -p ${SOURCE_FILE} ${T_FILES}
    /usr/bin/expect<<EOD

        set timeout 60
        spawn   sftp $ES_SFTP_USER@$ES_SFTP_HOST_NAME:$R_LOCATION
        expect "*?assword:"
        send "$password\r"
        expect "sftp>"
        send "put /opt/AppServer/ES_TEST/todays_report/*.txt\r"
        expect "sftp>"
        send "bye\r"
        expect EOD
    EOD
else
    echo "Нет файлов для копирования" >> ${LOGFILE}
fi

Мне нужно зафиксировать вывод команды expect в ${LOGFILE}. Как это можно сделать?

Я пытался добавить ниже приведенные вещи, но это не сработало. Что можно сделать?

/usr/bin/expect<<EOD >> ${LOGFILE} 2>&1

set timeout 60
spawn   sftp $ES_SFTP_USER@$ES_SFTP_HOST_NAME:$R_LOCATION
expect "*?assword:"
send "$password\r"
expect "sftp>"
send "put /opt/AppServer/ES_TEST/todays_report/*.txt\r"
expect "sftp>"
send "bye\r"
expect EOD
EOD

Кажется, что LOGFILE вне области видимости, вы его экспортировали? Посмотрите переменные окружения.

Вам нужно экспортировать переменную в окружение или передать её в качестве аргумента.

например.
Допустим, ваша программа называется abc, тогда сделайте:

LOGFILE=./logdir/logfile
export LOGFILE
./abc

или

LOGFILE=./logdir/logfile ./abc

В качестве альтернативы можно передать как аргумент:

./abc "./logdir/logfile"

И в программе иметь:

logfilename="$1"

Приведенная ниже перенаправление теперь работает нормально. Я ничего нового не добавлял.

/usr/bin/expect<<EOD > ${LOGFILE}

set timeout 60
spawn   sftp $ES_SFTP_USER@$ES_SFTP_HOST:$R_LOCATION
expect "*?assword:"
send "$password\r"
expect "sftp>"
send "put /opt/AppServer/ES_billing_report/todays_report/*.txt\r"
expect "sftp>"
send "bye\r"
expect EOD
EOD

Ответ или решение

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

Проблема и решение

Ваша основная задача заключается в том, чтобы логировать вывод команды Expect в переменную ${LOGFILE}. На первый взгляд, вы правильно использовали редирект в скрипте Expect, но существует несколько нюансов, которые необходимо учесть.

Рекомендации по изменению скрипта

  1. Проверка переменной LOGFILE: Убедитесь, что переменная ${LOGFILE} правильно инициализируется и доступна в рамках вашего скрипта. Это можно сделать, экспортировав переменную или передав её как параметр командной строки.

    LOGFILE="./logdir/logfile"
    export LOGFILE

    Или передача как параметр:

    ./abc "./logdir/logfile"
  2. Правильный синтаксис для редиректа: При использовании редиректа для Expect необходимо убедиться, что это сделано корректно. Вы уже нашли правильный способ для редиректа, но вот еще вариант как можно оформить ваш код для большей наглядности:

    if [ -n "${SOURCE_FILE}" ]; then
       cp -p ${SOURCE_FILE} ${T_FILES}
    
       /usr/bin/expect <<EOD >> ${LOGFILE} 2>&1
    
       set timeout 60
       spawn sftp $ES_SFTP_USER@$ES_SFTP_HOST_NAME:$R_LOCATION
       expect "*?assword:"
       send "$password\r"
       expect "sftp>"
       send "put /opt/AppServer/ES_TEST/todays_report/*.txt\r"
       expect "sftp>"
       send "bye\r"
       expect eof
       EOD
    else
       echo "No Files to copy" >> ${LOGFILE}
    fi
  3. Использование expect eof: Включение expect eof в конце вашего скрипта Expect гарантирует, что вся сессия завершится корректно и вы получите весь вывод.

  4. Проверка доступа к файлам: Убедитесь, что у вашего скрипта есть права на запись в файл журнала. Это может быть критичным, если скрипт запускается от учетной записи, которая не имеет соответствующих прав.

Заключение

Соблюдение правил, упомянутых выше, поможет вам успешно логировать вывод команды Expect в задаваемый файл. Убедитесь, что переменная ${LOGFILE} правильно задана и доступна в области видимости вашего скрипта, что особенно важно в сценариях, где вы используете переменные окружения. В случае, если вывод по-прежнему не записывается, проверьте права доступа и существование каталога для записи логов.

Ваш скрипт теперь эффективно записывает все необходимые данные, что помогает в дальнейшем анализе и отладке.

Оцените материал
Добавить комментарий

Капча загружается...