備份電子郵件日誌腳本向我發送垃圾郵件:瘋狂的 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
.