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

сценарий резервного копирования журнала электронной почты спам меня: безумное расширение BASH

У меня есть сценарий BASH, который «читает» журналы резервного копирования, сообщает об успехе / неудаче последнего резервного копирования, перечисляет содержимое каталога резервного копирования, а затем отправляет результаты по электронной почте. После переноса резервных копий на новый сервер и превращения подпрограммы электронной почты в функции он отправляет мне спам электронную почту. Похоже, он расширяет дату и отправляет электронное письмо для каждой даты, до которой она расширяется. Я не могу понять как, хоть убей. Вот код из "MAIN":

YDATE=$(date -s "yesterday" '+%a%b%d')
BKPLOG="/mnt/nfs/horizon/backuplog_$YDATE.log"

STATUS=$(cat /mnt/nfs/horizon/backuplog_$YDATE.log)

# Catenate logs and status into message body -- email report to 
# Support.
func_make_msg $MSG "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send $MSG "fake@admin.org" # Send it!

func_make_message просто создает сообщение. Обратите внимание, что ни одна из функций не входит в цикл for или while. Вот функция отправки:

function func_send ()
{
    local _message=$1
    local _cc=$2
    local _recipient=$3
    $PRINT --columns=2 -t < $_message | $MAIL -s "Backup Logs" "$_cc"
}

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

Сервер резервного копирования - Debian. Скрипт запускается на задании cron:

0 7 * * *      bash /home/bkpadmin/scripts/backup_mail.sh

Любые идеи? Время было на милю меньше, но я устранил фактор ntp, cron, запустив его вручную. Я получаю те же результаты даже после установки времени / даты и запуска вручную.

Вот функция func_make_msg для любопытных:

function func_make_msg ()
{
    local _msg_body=$1
    local _file=$2
    local _backup_status=$3
    local _db_backups=$4
    cat > $_msg_body << EOM 
## Nightly backup logs ###########################
** Backup Status **
File name: $_file
$_backup_status
---------------

** Important DB Server ****
$_db_backups
---------------
EOM
}

Спасибо ~

Бубнофф

ОБНОВИТЬ Спасибо, Деннис. Вот и все. Глупая, глупая ошибка с моей стороны. Полученные результаты в виде петли интересны. Я дважды дурак, так как на самом деле читаю страницу руководства, чтобы напомнить себе, как вычислить «вчера». Поменял s на d. «S», как я полагаю, «строка». ... Для большей глупости ... читайте дальше ...

Этого не произошло во время тестирования, потому что скрипт принадлежал и запускался под ... учетной записью обычного пользователя. Команда date -s завершилась неудачно, но все еще выводит вчера ... просто не установила системную дату ... отсутствуют разрешения и все такое. Указывает на мою вторую ... еще более идиотскую ошибку ... запись в cron была для root. Еще один пример того, почему никогда не следует запускать скрипты от имени пользователя root или даже входить в систему как root, если нет другого пути.

Сценарий смог изменить системную дату и дату, и сильно ошибся, поскольку переменная неоднократно расширялась благодаря своим полномочиям root. Пока мы говорим, я сдаюсь соответствующим властям. Прости, мир.

Может ли кто-нибудь увидеть другие глупые ошибки, пока мы говорим об этом?

Моя первая рекомендация - цитировать $MSG в этих строках:

func_make_msg "$MSG" "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send "$MSG" "fake@admin.org" # Send it!

и $_message в этой строке

$PRINT --columns=2 -t < "$_message" | $MAIL -s "Backup Logs" "$_cc"

Но я предполагаю, что это имена файлов, и они не являются источником вашей проблемы.

Вы можете устранить cat в этой строке:

STATUS=$(< /mnt/nfs/horizon/backuplog_$YDATE.log)

Но, опять же, это не ваша настоящая проблема.

Редактировать:

Думаю, я нашел вашу проблему: date -s наборы дату и время. Попробуйте удалить -s.