利用inotifywait实现关键目录实时监控报警,通过持续监听create/modify/delete等事件触发邮件、日志或webhook告警,需注意资源限制、脚本守护及误报过滤。

利用 inotify 机制开发关键目录实时报警脚本,核心是用 inotifywait(来自 inotify-tools)监听文件系统事件,并在触发时执行告警逻辑(如发邮件、写日志、调用 webhook)。它轻量、低开销、无需轮询,适合监控 /etc、/root、/var/log 等敏感路径。
安装与基础监听
确保系统已安装 inotify-tools:
- Ubuntu/Debian:
sudo apt install inotify-tools - CentOS/RHEL:
sudo yum install inotify-tools或dnf install inotify-tools
先测试监听效果,例如监控 /etc 下的创建、修改、删除操作:
inotifywait -m -e create,modify,delete,attrib /etc
其中:
-m 表示持续监听;
-e 指定事件类型(常用:create、modify、delete、move_self、attrib(属性变更,如 chmod/chown));
可叠加多个 -e 或用逗号分隔(如 -e create,modify,delete)。
编写可运行的报警脚本
以下是一个简洁可靠的 shell 脚本示例(保存为 /usr/local/bin/monitor_critical.sh):
#!/bin/bash
MONITOR_DIR="/etc"
LOG_FILE="/var/log/inotify-alert.log"
ALERT_EMAIL="admin@example.com"
# 初始化日志
echo "[$(date)] Monitoring started for $MONITOR_DIR" >> "$LOG_FILE"
# 持续监听并处理事件
inotifywait -m -e create,modify,delete,attrib,moved_to "$MONITOR_DIR" --format '%w%f %e %T' --timefmt '%Y-%m-%d %H:%M:%S' | while read file event time; do
echo "[$time] ALERT: $event on $file" >> "$LOG_FILE"
# 邮件告警(需配置本地 sendmail 或 msmtp)
echo "Detected $event on $file at $time" | mail -s "[ALERT] File change in $MONITOR_DIR" "$ALERT_EMAIL"
# 可选:记录到 syslog
logger -t "inotify-monitor" "ALERT: $event on $file"
done
注意:
– 使用 --format 和 --timefmt 获取可读时间与完整路径;
– moved_to 覆盖常见上传/移动场景(如 cp、scp 写入);
– 若需递归监控子目录,加 -r 参数(但慎用于大目录,避免 inotify limit 耗尽)。
规避常见陷阱
-
inotify 资源限制:默认单用户 inotify 实例数有限(
/proc/sys/fs/inotify/max_user_instances),监控多目录时建议合并监听或调高限制 -
脚本意外退出:用 systemd service 管理,设置
Restart=always,避免中断后失守 -
误报控制:过滤临时文件(如编辑器生成的
*~、.swp),可在 while 循环内加[[ "$file" =~ \.(swp|~|tmp)$ ]] && continue - 权限问题:脚本需有读取目标目录及执行 inotifywait 的权限;若监控 /root,建议以 root 运行
增强实用性建议
- 集成企业微信/钉钉 webhook:用 curl 发送 JSON 消息,比邮件更及时
- 添加白名单机制:对可信进程(如 ansible、yum)的操作跳过告警(需结合 auditd 或 /proc/*/comm 辅助识别,较复杂)
- 对接 SIEM 工具:将日志输出到 rsyslog 或 journal,再转发至 ELK/Splunk
- 使用
inotifywatch做周期性统计分析(如“过去1小时 /etc 修改次数”),辅助基线建模
不复杂但容易忽略:一次只专注监控真正关键的 2–3 个目录,优先保障稳定性和响应速度,而非贪多。

















