几年前,我设置了一个 cron 作业,作为监控系统的一部分,每分钟自动 ping 一个 URL(这过于简单化,但它可以解决这个问题)。因为我是一个可怕的人,所以我没有在任何地方记录这一点。
几年后的今天,我开始在 ping URL 另一端的应用程序上遇到问题。我修复了它,但后来意识到,我不知道这个 cron 作业是从哪里来的。
有没有办法快速搜索或找出特定系统上的所有 crontab?我有 root 访问权限,所以权限不是问题。我只是 的用户cron
,我从未深入研究过它的实现,但我的 *nix 直觉告诉我,某个地方必须有一组文本文件来保存所有 crontab。我只是不知道它们在哪里,如果我深入研究,我会害怕找到一些,但不是全部,或者错过系统的一些奇怪的细微差别
另外,我意识到通过 root 访问我可以
- 获取系统中所有用户的列表
su
作为用户crontab -l
- 对所有用户重复此操作
但我正在寻找一些不太手动的东西(并希望了解有关 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。