Bash: как записать вывод команды из HEREDOC в лог файл
Есть основной сервер. Он выполняет большой список команд с помощью HEREDOC по SSH на удалённом сервере. К каждой команде есть условие if. Результат выполнения команд на удалённом сервере логируется в файл на основном сервере. Но проблема в том, что логирование работает очень криво. Либо не работает в принципе, либо если завернуть в функцию, то выполняется всегда в независимости от результата. Как это можно реализовать? Либо можно реализовать подобный скрипт без HEREDOC?
Пример:
function ssh_connection {
ssh -T -i <ssh_key> [email protected]
}
log="Failed! $(date)"
log_file=/var/log/log_file
ssh_connection << SCRIPT
command
if [ \$? - eq 0 ]
then
echo "Success"
else
echo "Failed"
echo $log >> $log_file
fi
SCRIPT
Ответы (1 шт):
Автор решения: PotroNik
→ Ссылка
Вот небольшой пример
Поставил комментарии по набору команд
EOF>>${log_file} - будет перенаправлять вывод с удаленной машины в указанный внутри переменной файл.
#Лог файл
log_file=/var/log/log_file
#Функция для подстановки временной метки сообщению
say() {
echo "`date +'%Y-%m-%d %T'` --> ${1}"
}
#Функция для запуска простых команд с проверкой выхода
#Первый аргумент команда, второй комментарий для логирования
runner() {
#Запуск с переводом в поток ошибок, что бы вывод команды не попал в лог файл
${1} 1>&2
if [ $? -ne 0 ]; then
say "FAIL: ${2}"
else
say "OK: ${2}"
fi
}
#Подключаемся на удаленную машину, отключаем приветствие
ssh -T -i <ssh_key> [email protected] '/bin/bash --norc' <<EOF>>${log_file}
#Устанавливаем функции для удаленной машины, так как до этого момента они были объявлены только локально
$(typeset -f say)
$(typeset -f runner)
#Логируем начало работы для хоста
say "INFO - запущен скрипт - `hostname`"
runner "true" 'правда'
runner "false" "псевдоправла"
say "INFO - завершено выполнение"
EOF