아래 bash 스크립트는 루트 사용자로 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에 있는지 확실하지 않습니다.