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 中是否有附加 [@]。

相關內容