如何编写监控指定文件的Bash脚本实现删除警告确认
如何用Bash脚本监控文件并拦截删除操作?
嘿,这个需求我之前折腾过!其实不用自己从零写检测逻辑,Linux下的inotify-tools工具刚好能完美解决——它专门用来监听文件系统的各类事件,包括删除尝试。下面我给你一步步拆解实现方法和实用技巧:
第一步:先安装依赖工具
首先得确保系统上装了inotify-tools,不同发行版的安装命令如下:
- Debian/Ubuntu系:
sudo apt update && sudo apt install inotify-tools - RHEL/CentOS系:
sudo yum install inotify-tools
第二步:编写可运行的监控脚本
直接给你一个能落地的脚本,我会逐行解释关键部分:
#!/bin/bash # 检查用户是否传入了目标文件参数 if [ $# -ne 1 ]; then echo "用法: $0 <待监控的文件路径>" exit 1 fi TARGET_FILE="$1" # 先确认目标文件存在,避免白忙活 if [ ! -f "$TARGET_FILE" ]; then echo "错误: 文件 $TARGET_FILE 不存在!" exit 1 fi # 脚本启动时先创建带时间戳的备份,防止删除后无法恢复 BACKUP_PATH="/tmp/$(basename "$TARGET_FILE")_$(date +%Y%m%d%H%M%S)_backup" cp "$TARGET_FILE" "$BACKUP_PATH" echo "已创建文件备份: $BACKUP_PATH" # 持续循环监控文件事件 while true; do # 监听两个关键事件: # DELETE_SELF: 文件自身被删除(比如被mv或者rm掉) # DELETE: 父目录中该文件被删除(直接用rm命令时触发) inotifywait -e DELETE_SELF -e DELETE "$TARGET_FILE" 2>/dev/null # 弹出确认对话框,优先用图形化工具,没有的话用终端交互 if command -v zenity &>/dev/null; then zenity --question --text="⚠️ 警告!有人尝试删除文件:\n$TARGET_FILE\n是否确认删除?" --width=450 CONFIRM_RESULT=$? else read -p "⚠️ 警告!有人尝试删除文件 $TARGET_FILE,是否确认删除?(y/N) " USER_INPUT case "$USER_INPUT" in [Yy]* ) CONFIRM_RESULT=0;; * ) CONFIRM_RESULT=1;; esac fi # 根据用户选择处理 if [ $CONFIRM_RESULT -ne 0 ]; then # 用户取消删除,从备份恢复文件 cp "$BACKUP_PATH" "$TARGET_FILE" echo "✅ 删除已取消,文件已从备份恢复" else # 用户确认删除,清理备份并退出监控 rm "$BACKUP_PATH" echo "ℹ️ 用户确认删除,监控已停止" exit 0 fi done
关键技巧和注意事项
- 事件监听逻辑:
inotifywait是阻塞式的,每次捕获到指定事件后才会继续执行,所以用while true循环实现持续监控 - 备份策略:脚本启动时就创建带时间戳的备份,避免恢复时覆盖最新内容;如果需要实时备份,可以在脚本里加定时备份的逻辑
- 交互兼容性:同时支持图形化(zenity)和终端交互,适配不同使用场景
- 后台运行:如果需要长期监控,可以把脚本后台执行,比如:
nohup ./file_monitor.sh /path/to/your/file & - 权限问题:脚本需要拥有目标文件的读写权限,以及备份目录(这里是/tmp)的写入权限
- 跨平台提示:
inotify是Linux专属工具,如果要在macOS上实现类似功能,可以用fswatch替代,核心逻辑大同小异
内容的提问来源于stack exchange,提问作者Dax
相关产品推荐
相关产品推荐

