FreeBSD 上的 Bash 脚本问题

FreeBSD 上的 Bash 脚本问题

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

相关内容