어쩌면 뭔가 빠졌을 수도 있지만 ls의 출력을 가져와 해시를 생성한 다음 다른 해시를 얻는 bash 스크립트가 있습니다. 해시가 일치하면 아무런 조치도 취하지 않습니다. 서로 다른 경우 관리자에게 이메일을 보내고 해시를 덮어써서 다시 일치시켜야 합니다. 스크립트는 다음과 같습니다.
logday="$(date '+%Y-%m-%d')"
sdir="/home/admin/notify"
timestamp="$(date '+%Y-%m-%dT%H:%M:%S')"
log="$sdir/log/$logday-notification.log"
if ! test -f $sdir/hash1; then
touch $sdir/hash1
ls -alR /mnt/DVR/3 | md5sum > $sdir/hash1
else
echo "hash already present"
fi
ls -alR /mnt/DVR/3 | md5sum > $sdir/hash2
if cmp -s $sdir/hash1 $sdir/hash2; then
echo "$timestamp - Hash matches, nothing to do." >> "$log"
else
echo "$timestamp - Hash has changed! Sending notification. Writing new value to hash1" >> "$log"
cp -f $sdir/hash1 $sdir/hash2
echo "it changed" | mail -s "alert" [email protected]
fi
exit
따라서 스크립트를 처음 실행하면 다음과 같은 로그 출력이 표시됩니다.
"해시 일치, 할 일이 없습니다."
말이 되네요. 해시*를 처리하면 다음과 같은 결과가 나타납니다.
$ cat hash*
36d28cb4a6b384abe5c3acc81c93c891 -
36d28cb4a6b384abe5c3acc81c93c891 -
다시 말하지만, 말이 되네요
다시 실행하면 해시가 일치하지만 이메일은 없습니다. 다시 말하지만, 이는 의미가 있으며 아무것도 변경되지 않았습니다.
이제 디렉토리를 변경합니다. 스크립트를 실행합니다. "해시가 변경되었습니다! 알림을 보내는 중입니다. hash1에 새 값을 쓰고 있습니다."라는 메시지가 표시됩니다.
예, 맞습니다. 해시가 다릅니다. 스크립트는 해시를 덮어쓰므로 이제 일치해야 합니다. Running cat hash*가 이를 확인했습니다.
$ cat hash*
856d69a9b53008988d034c9504345541 -
856d69a9b53008988d034c9504345541 -
두 파일은 모두 동일합니다. 하지만 이제 스크립트를 다시 실행하면 여전히 다르다고 나옵니다!
나는 왜 이런 일이 일어나는지 궁금해하기 시작했습니다. 어떤 아이디어가 있나요?
답변1
echo "$timestamp - Hash has changed! Sending notification. Writing new value to hash1" >> "$log"
cp -f $sdir/hash1 $sdir/hash2
너설명하다에 새 값을 쓰고 있지만 hash1
실제로는 무엇을 하고 있나요?하다hash1
이전 값을 에 복사 하는 것입니다 hash2
.
따라서 스크립트가 실행되지 않는 경우 두 해시는 항상 동일하지만 값이 이전 해시이므로 다음에 실행될 때 알림이 다시 트리거됩니다.
이 문제를 해결하려면 다음 명령에서 해시 순서를 변경하세요 cp
.
cp -f $sdir/hash2 $sdir/hash1