备份电子邮件日志脚本向我发送垃圾邮件:疯狂的 BASH 扩展

备份电子邮件日志脚本向我发送垃圾邮件:疯狂的 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 "[email protected]" # 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
}

谢谢〜

布布诺夫

更新谢谢 Dennis。就是这样。我犯了一个非常愚蠢的错误。由此产生的类似循环的结果很有趣。我真是愚蠢至极,因为我实际上阅读了手册页来提醒自己如何计算“昨天”。将“s”替换为“d”。我猜“S”是“string”中的“S”。……要了解更多愚蠢之处……请继续阅读……

在测试期间没有发生这种情况,因为该脚本属于普通用户帐户,并且是在普通用户帐户中运行的。date -s 命令失败,但昨天仍然输出...只是没有设置系统日期...缺乏权限等等。指出我的第二个...甚至更愚蠢的错误...cron 条目是针对 root 的。另一个例子说明了为什么除非没有其他办法,否则永远不应该以 root 身份运行脚本,甚至不应该以 root 身份登录。

由于拥有 rootly 的权力,该脚本能够更改系统日期,并且由于变量被反复扩展而导致严重问题。我正在向有关当局自首。对不起,世界。

当我们讨论这个话题时,有人能发现其他愚蠢的错误吗?

答案1

我的第一个建议是引用$MSG以下几行:

func_make_msg "$MSG" "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send "$MSG" "[email protected]" # Send it!

$_message这一行

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

但我认为那些是文件名,并且它们不是问题的根源。

您可以消除cat此行:

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

但再说一遍,这不是你的真正问题。

编辑:

我想我找到你的问题了:date -s 日期和时间。尝试删除-s

相关内容