我將下面的 bash 腳本設定為以 root 使用者身分透過 cron 每小時運行一次。該腳本的目的是在文件上傳到我們的 sftp 伺服器時向我們發送電子郵件並向我們發送登入資訊。這是腳本
build_report() {
# This function builds the report header and gets the list of files
#Get all the files under /home/SFTP
local f=($( find "/home/SFTP" -type f | tr " " "_" ))
echo
echo "********************************************";
echo "*************** FILE REPORT ****************";
echo "********************************************";
echo "**** SEARCHING THROUGH SFTP FOLDERS ******";
echo "********************************************";
echo "* IF I FIND SOMETHING, I WILL LIST IT HERE *";
echo "********************************************";
echo "********************************************";
echo "GENERATED ON $TIMESTAMP ";
echo
echo
#Loop through all the files and list list them
for i in " ${f[@]}"
do
echo $i
done
}
sftp_log() {
#This function checks the /var/log/auth.log file for sessions
echo "*****************Begin Access Log*********************"
cat /var/log/auth.log|grep -E "interactive/pam"
}
TIMESTAMP=$(date)
files=$(find "/home/SFTP" -type f | tr " " "_")
#If there are files present create the report, email it and log we found something.
#Else, log we didn't find anything
if [ "$files" != "" ]; then
{ build_report && sftp_log; } | awk '{print $0,"\n"}' | mail -s "report" [email protected]
echo $TIMESTAMP " Files found. Email Sent">>filereport.log
else
echo $TIMESTAMP " No files found" >>filereport.log
fi
exit 0
該問題每天早上 8 點發布。這是發生的情況的範例
上午 7 點:文件存在。報告與兩個函數的輸出一起正確發送。
上午 8 點:存在相同的文件。報告僅隨 build_report 函數的輸出一起傳送
上午 9 點:存在相同的文件。報告僅隨 build_report 函數的輸出一起傳送
上午 10 點:文件仍然存在(可能是新增的新文件,也可能是同一文件)。已發送一封電子郵件,其中兩個函數的輸出均正確,並且現在存在 8-9 點之間發生的登入。
我將 auth.log 設定為每週輪換一次,以確保不存在某種文件輪換/文件鎖定問題。此外,如果上午 7 點存在文件,我們將收到正確的報告。
有任何想法嗎?我的 bash 腳本編寫能力充其量也很粗糙,所以歡迎任何想法
答案1
輸入 echo $BASH 看看會發生什麼,你可能會發現,除非你明確告訴 Crown 使用 bash,否則它會使用 sh,而且我不確定 FreeBSD sh 中是否有附加 [@]。