逃亡者クロンタブを見つける方法


17

数年前、私はcronジョブをセットアップして、監視システムの一部として1分ごとに自動的にURLにpingを実行しました(これは簡単すぎますが、この質問には役立ちます)。私は恐ろしい人なので、これをどこにも記録しませんでした。

今日、数年後、私はpingされているURLの反対側のアプリケーションで問題が発生し始めました。私はそれを修正しましたが、このcronジョブがどこから来たのかわかりません

特定のシステム上のすべてのcrontabをすばやく検索または除外する方法はありますか?ルートアクセス権があるので、アクセス許可は問題になりません。私はのユーザーでしかありcronませんが、その実装をあまり深く見たことはありませんが、私の* nix本能は、すべてのcrontabを保持するテキストファイルのグループがどこかにある必要があると言います。私は彼らがどこにいるかわからないだけで、それを掘り下げた場合、それらのすべてではなく、いくつかを見つけることを恐れるか、システムの奇妙なニュアンスを逃します

また、私はルートアクセスで私ができることに気付きました

  1. システム内のすべてのユーザーのリストを取得します
  2. su ユーザーとして
  3. crontab -l
  4. すべてのユーザーで繰り返します

しかし、私は少し少ないマニュアルを探しています(そしてcronの実装について何かを学ぶことを探しています)


2
-あなたは、このリンクを見てする必要があるかもしれませんstackoverflow.com/questions/134906/...
ダニエルトン。

回答:


20

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>

8

Crontabは/etc/crontab、(多くの実装で)そのコンポーネントを/etc/cron.*/*(すべてrootによって編集された)および/var/spool/cron/*(ユーザーのcrontab)に配置します。

問題のあるジョブの特定に問題がある場合、別のアプローチとして、進行中のジョブを調査します。たとえば、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")" "$@"

+1は、問題を取得してそれ自体を説明する方法を示しているためです!
ジョー

6

迅速で汚い方法:

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

正確な位置crontabファイルが格納されるシステムによって異なることがあり、それは、一般的だ/var/spoolと持っているcrontab名前でどこかを。

また、多くのシステムが持っていることに注意して、システムのcrontab(のように/etc/crontab/etc/cron.dのような複数のスクリプトを呼び出すことができ、その一部を)/etc/cron.hourly.daily...


4

これは、crontabによって作成されたcronjobのように聞こえます。すべてのcrontabに-uスイッチがあるわけではありませんが、GNU / Linuxには使用できます。これは、crontabによって作成されたすべてのcronjobをリストするのに便利な行です。

for user in $(awk -F':' '{ print $1}' /etc/passwd); do crontab -u $user -l; done

(ルートとして実行します。)


2

他のすべてが失敗した場合、要求しているURLからハニーポットを作成します(つまり、大きなファイルなどを提供します)。データの受信を待機しているプロセスを探し、そのPPIDを検索します。


2

適切なシステムであれば、マンページ内のcrontabの正確な位置を説明する必要があります(通常はFILES、終わり近くのセクション、および他のデーモン用)。

たとえば、私のシステムでcron(8)は、次のものが含まれています。

 FILES
      /etc/crontab          system crontab file
      /var/cron/atjobs      directory containing at(1) jobs
      /var/cron/log         cron's log file
      /var/cron/tabs        directory containing individual crontab files
      /var/cron/tabs/.sock  used by crontab(1) to tell cron to check for
                            crontab changes immediately

そして、私はatあなたがそれにいる間に仕事もチェックするというタイラーのアドバイスを2番目にします。


2

別の方法でアプローチする 'ラウンド:cronは最初にこの種の問題を回避するために、実行中のログを保持します。私のシステムでは、ログは/var/cron/log次のように保存されています。

==> /var/cron/log <==
Oct 25 00:21:01 fortress cron[20232]: (vucar) CMD (/home/vucar/lighttpd-watchdog)

この行は、マシン上のPID 20232を持つcronインスタンスがuserに代わってfortress実行さ/home/vucar/lighttpd-watchdogれていることを示していますvucar。正常に動作するシステムでは単一のcronのみが実行されるため、これは簡単です。

atとにかくcronに渡されるのが普通なので、これはジョブでも機能します:

==> /var/cron/log <==
Oct 25 00:28:01 fortress cron[31282]: (vucar) ATJOB (1414189680.c)

スニペットはBSDシステムのものですが、一般的な概念は他のどこでも同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.