直接检查任务文件
crontab -l 是按当前存在的用户去查询任务,而任务文件本身保存在 /var/spool/cron 目录里。两者的差异很关键:账号被删除后,它的任务文件可能仍然留在 spool 目录中并照常执行。所以排查定时任务时,直接翻目录比逐个用户查询更完整,也更容易发现「这个任务到底属于谁」——文件名就是用户名,一看便知。
基本信息
| Debian 系路径 | /var/spool/cron/crontabs/ 目录下以用户名命名的文件 |
|---|---|
| RHEL 系路径 | /var/spool/cron/ 目录下以用户名命名的文件 |
| 目录权限 | 目录通常为 700 或 1730,普通用户不可读,需 root 操作 |
| 检查内容 | 文件名、文件内容、mtime、属主与权限 |
| 与命令的差异 | crontab -l 看不到无主用户的任务文件 |
| 修改方式 | 应通过 crontab 命令而不是手工编辑文件,避免绕过格式校验 |
典型使用场景
- 确认是否有已删除账号遗留的任务仍在执行
- 排查任务表执行的内容与 crontab -l 输出不一致的情况
- 核对任务文件的修改时间,判断是否在入侵窗口内被写入
- 清理时保留原文与文件属性作为证据
- 判断某个可疑任务的执行身份到底是谁
直接翻任务文件
直接翻任务文件
sudo ls -la /var/spool/cron/ /var/spool/cron/crontabs/ 2>/dev/null
sudo cat /var/spool/cron/root 2>/dev/null; sudo cat /var/spool/cron/crontabs/root 2>/dev/null
sudo find /var/spool/cron -type f -exec ls -l --time-style=full-iso {} + 2>/dev/null
sudo awk -F: '{print $1}' /etc/passwd | sort > /tmp/users.txt # 现有用户
sudo ls /var/spool/cron /var/spool/cron/crontabs 2>/dev/null | sort -u > /tmp/spool.txt
comm -13 /tmp/users.txt /tmp/spool.txt # 无主任务文件
sudo grep -rEn 'curl|wget|base64|/tmp/' /var/spool/cron/ /var/spool/cron/crontabs/ 2>/dev/null | head现象与含义
| 现象 | 含义 | 处理建议 |
|---|---|---|
| 文件名对应的用户已不存在 | 遗留任务,仍会被 cron 执行 | 先备份内容与属性,再决定清理 |
| 文件 mtime 落在入侵窗口 | 任务可能刚被写入 | 与进程启动时间、日志对照后处理 |
| 内容含下载并执行 | 典型保活任务 | 复制原文留证后整段删除 |
| 属主或权限异常 | 可能被手工改写 | 记录原始属性,作为篡改痕迹 |
| 目录里出现备份文件名 | 有人尝试隐藏或恢复任务 | 检查同目录其他可疑文件 |
对比用户列表与目录清单是最快的方法:用 passwd 里的用户列表与 spool 目录下的文件名取差集,只在目录里出现的文件就代表遗留或无主任务,这类条目恰恰最容易被漏掉。
不要手工直接编辑 spool 文件:手工写入绕过 crontab 的格式校验,容易写坏任务表导致 cron 报错或整表失效。清理应通过 crontab -u 用户名 -r 或按行删除后再校验。