我将以下 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 中是否附加 [@]。