-cmin -60 不等于“刚创建”,因其检查的是状态更改时间(ctime),涵盖写入、权限修改等操作,并非创建时间;linux 大多文件系统不暴露标准创建时间,find 也不支持 birth time 谓词。

不能直接用 find -cmin -60 查“过去一小时内被创建”的文件,因为 -cmin 检查的是**状态更改时间(ctime)**,不是创建时间(birth time),而 Linux 大部分文件系统(如 ext4)不暴露标准的创建时间,find 也不支持 -Bmin 或类似原生创建时间选项。
为什么 -cmin -60 不等于“刚创建”
-cmin -60 找的是 ctime 在过去 60 分钟内发生变化的文件——这包括:文件被写入、权限被修改、所有者变更、甚至硬链接数变化等。新建一个可执行文件确实会触发 ctime 更新,但很多其他操作也会,所以结果不精确,且可能漏掉或误报。
更关键的是:Linux 内核和 POSIX 不保证文件“创建时间”可被用户空间可靠读取。即使某些文件系统(如 btrfs、xfs)支持 birth time,find 当前(截至 GNU findutils 4.9.x)仍不提供基于 birth time 的谓词。
较实用的替代方案:用 -mmin -60 + 可执行权限 + 临时文件名特征
虽然无法 100% 精确抓“创建”,但多数临时可执行文件具有如下行为特征,可组合过滤:
- 最近被修改(-mmin -60):新建即写入,mtime 通常与创建时间高度接近;
- 有可执行权限(-perm /111):匹配 user/group/other 中任意一位为 x;
-
常见临时路径或命名(-name、-path):如
/tmp/*、/var/tmp/*、以.tmp、~、$$、exec_开头的文件。
示例命令:
find /tmp /var/tmp -maxdepth 2 \
-mmin -60 \
-type f \
-perm /111 \
 >\( -name "*\.tmp" -o -name "*~" -o -name "exec_*" -o -name ".*\.sh" \) \
2>/dev/null
进阶:用 stat + awk 提取 birth time(仅限支持的文件系统)
若你使用 btrfs 或较新 xfs(内核 ≥ 5.10,且挂载启用 statx 支持),可用 stat -c '%w %n' 文件 查看 birth time(显示为 YYYY-MM-DD HH:MM:SS.NNNNNNNNN 或 - 表示不可用)。配合脚本筛选:
find /tmp -type f -mmin -60 -perm /111 2>/dev/null | while read f; do
birth=$(stat -c '%w' "$f" 2>/dev/null | cut -d' ' -f1,2)
if [[ "$birth" != "-" && "$birth" > "$(date -d '60 minutes ago' '+%Y-%m-%d %H:%M')" ]]; then
echo "$f"
fi
done
⚠️ 注意:该方法依赖文件系统支持,且 stat %w 在多数 ext4 上始终返回 -,实际可用性有限。
安全运维建议:监控而非事后搜索
真正防范恶意临时可执行文件,靠定时 find 搜索效率低、易遗漏。更有效的方式是:
- 启用 auditd 监控
/tmp和/var/tmp的 execve 和 creat 系统调用; - 设置 noexec 挂载选项(如
mount -o remount,noexec /tmp); - 使用 systemd-tmpfiles 定期清理 + tmpfiles.d 规则限制临时目录权限;
- 部署 EDR 工具(如 osquery、Wazuh)做实时行为检测。
这些比依赖创建时间更可靠、更主动。











