如何找到逃亡的 crontab

如何找到逃亡的 crontab

几年前,我设置了一个 cron 作业,作为监控系统的一部分,每分钟自动 ping 一个 URL(这过于简单化,但它可以解决这个问题)。因为我是一个可怕的人,所以我没有在任何地方记录这一点。

几年后的今天,我开始在 ping URL 另一端的应用程序上遇到问题。我修复了它,但后来意识到,我不知道这个 cron 作业是从哪里来的

有没有办法快速搜索或找出特定系统上的所有 crontab?我有 root 访问权限,所以权限不是问题。我只是 的用户cron,我从未深入研究过它的实现,但我的 *nix 直觉告诉我,某个地方必须有一组文本文件来保存所有 crontab。我只是不知道它们在哪里,如果我深入研究,我会害怕找到一些,但不是全部,或者错过系统的一些奇怪的细微差别

另外,我意识到通过 root 访问我可以

  1. 获取系统中所有用户的列表
  2. su作为用户
  3. crontab -l
  4. 对所有用户重复此操作

但我正在寻找一些不太手动的东西(并希望了解有关 cron 实现的一些知识)

答案1

crontab 只能隐藏几个地方:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    这些是从 调用的/etc/crontab,所以可能在上面有一个星号
  • /var/spool/cron/*(有时/var/spool/cron/crontabs/*

一定要检查at一下,这会使其工作保持在/var/spool/at//var/spool/cron/at*/

另外,代替

su <user>
crontab -l

只需这样做:

crontab -lu <user>

答案2

Crontabs 存在于/etc/crontab(有许多实现)其组件/etc/cron.*/*(全部由 root 编辑)和/var/spool/cron/*(用户的 crontabs)中。

如果您无法找到有问题的工作,另一种方法是在工作正在进行时进行调查。例如,您可以添加防火墙规则来记录example.com在端口 80 上打开连接的进程的用户 ID:

iptables -A OUTPUT -p tcp --syn -d example.com --dport 80 -j LOG --log-prefix "[->example.com] " --log-uid

如果作业正在使用诸如ping或 之类的应用程序curl,则通过一个包装器来隐藏通常的二进制文件,该包装器会记录有关正在使用它的内容的信息,并使用如下所示的脚本/usr/local/bin

#!/bin/sh
{
  date
  echo "$0" "$@"
  ps -p $PPID
  echo
} >>"/tmp/$(basename "$0").log"
exec "/usr/bin/$(basename "$0")" "$@"

答案3

快速而肮脏的方法:

grep -r ping /var/spool/cron/crontabs

具体位置在哪里定时任务存储的内容可能因系统而异,但通常都在名称中/var/spool并且crontab在名称中的某个位置。

另请注意,许多系统都有系统crontabs(如/etc/crontab, /etc/cron.d)其中一些可能会调用更多脚本,如/etc/cron.hourly, .daily...

答案4

如果所有其他方法都失败了,您可以根据其请求的 URL 创建一个蜜罐(即提供一个大文件或其他内容)并查找正在等待接收数据的进程,然后查找其 PPID。

相关内容