也许我遗漏了一些东西,但我有一个 bash 脚本,它获取 ls 的输出,生成哈希值,然后获取另一个哈希值。如果哈希值匹配,则不执行任何操作。如果它们不同,则应向管理员发送电子邮件,然后覆盖哈希值,以便它们再次匹配。这是脚本:
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”
是的,有道理,哈希值不同。该脚本会覆盖哈希值,因此它们现在应该匹配。运行 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