So finden Sie einen flüchtigen Crontab

17

Vor ein paar Jahren habe ich einen Cron-Job eingerichtet, um im Rahmen eines Überwachungssystems automatisch jede Minute einen Ping-Befehl an eine URL zu senden. Weil ich eine schreckliche Person bin, habe ich das nirgendwo dokumentiert.

Heute, Jahre später, bekam ich Probleme mit der Anwendung am anderen Ende der URL, die als Ping gesendet wird. Ich habe es behoben, aber dann festgestellt, dass ich keine Ahnung habe, woher dieser Cron-Job kommt .

Gibt es eine Möglichkeit, alle Crontabs auf einem bestimmten System schnell zu durchsuchen oder zu durchsuchen? Ich habe Root-Zugriff, sodass Berechtigungen kein Problem darstellen. Ich war bisher nur ein Benutzer von cron. Ich habe mir die Implementierung noch nie so genau angesehen, aber meine * nix-Instinkte sagen, dass es irgendwo eine Gruppe von Textdateien geben muss, die alle Crontabs enthalten. Ich weiß nur nicht, wo sie sich befinden würden, und wenn ich mich darum kümmern würde, hätte ich Angst, einige zu finden, aber nicht alle, oder irgendeine merkwürdige Nuance des Systems zu verpassen

Außerdem erkenne ich mit root-Zugriff, dass ich könnte

  1. Rufen Sie eine Liste aller Benutzer im System ab
  2. su als Benutzer
  3. crontab -l
  4. Wiederholen Sie mit allen Benutzern

aber ich bin auf der Suche nach etwas weniger Handbuch (und auf der Suche nach etwas über die Implementierung von cron zu lernen)

Alan Storm
quelle
2
Möglicherweise müssen Sie sich diesen Link ansehen
Daniel t.

Antworten:

20

Es gibt nur wenige Stellen, an denen sich Crontabs verstecken können:

  • /etc/crontab
  • /etc/cron.d/*
  • /etc/crond.{hourly,daily,weekly,monthly}/*
    diese werden von angerufen /etc/crontab, also vielleicht ein sternchen dazu
  • /var/spool/cron/*(manchmal /var/spool/cron/crontabs/*)

Achten Sie atauch darauf, welche Jobs in /var/spool/at/oder erhalten bleiben/var/spool/cron/at*/

Auch anstelle von

su <user>
crontab -l

Mach einfach folgendes:

crontab -lu <user>
tylerl
quelle
8

Crontabs leben in /etc/crontabund (mit vielen Implementierungen) seinen Komponenten in /etc/cron.*/*(alle bearbeitet von root) und in /var/spool/cron/*(Benutzer-Crontabs).

Wenn Sie Probleme bei der Suche nach dem betreffenden Job haben, können Sie einen anderen Ansatz wählen, während er ausgeführt wird. Sie können beispielsweise eine Firewall-Regel hinzufügen, um die Benutzer-ID des Prozesses zu protokollieren, der Verbindungen zu example.comPort 80 herstellt:

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

Wenn der Job eine Anwendung wie pingoder verwendet curl, spiegeln Sie die übliche Binärdatei mit einem Wrapper, der Informationen über die Verwendung protokolliert, mit einem Skript wie dem folgenden in /usr/local/bin:

#!/bin/sh
{
  date
  echo "$0" "$@"
  ps -p $PPID
  echo
} >>"/tmp/$(basename "$0").log"
exec "/usr/bin/$(basename "$0")" "$@"
Gilles 'SO - hör auf böse zu sein'
quelle
+1 weil es zeigt, wie man das Problem dazu bringt, sich selbst zu erklären!
Joe
6

Der schnelle und schmutzige Weg:

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

Der genaue Ort, an dem Crontabs aufbewahrt werden, kann von System zu System unterschiedlich sein, befindet sich jedoch im Allgemeinen in /var/spoolund hat crontabirgendwo im Namen.

Beachten Sie, dass viele Systeme haben System crontabs (wie in /etc/crontab, /etc/cron.d) von denen einige mehr Skripte aufrufen wie /etc/cron.hourly, .daily...

Stéphane Chazelas
quelle
4

Das klingt nach einem Cronjob, den crontab erstellt hat. Nicht alle Crontabs haben einen -uSwitch, aber für GNU / Linux ist er verfügbar. Dies ist eine praktische Zeile, um alle von crontab erstellten Cronjobs aufzulisten.

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

(Als root ausführen.)

Christopher
quelle
2

Wenn alles andere fehlschlägt, können Sie aus der angeforderten URL einen Honeypot erstellen, dh eine große Datei oder etwas anderes bereitstellen. Suchen Sie dann nach dem Prozess, der auf den Empfang der Daten wartet, und schlagen Sie die PPID nach.

sendmoreinfo
quelle
2

Jedes anständige System sollte die genaue Position der Crontabs in der Manpage erklären (normalerweise im FILESAbschnitt am Ende und auch für andere Dæmons).

cron(8)Enthält beispielsweise auf meinem System Folgendes:

 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

Und ich rate tylerl, auch unterwegs nach atJobs zu suchen .

Vucar Timnärakrul
quelle
2

Umgekehrt: cron protokolliert, was es tut, gerade um solche Probleme überhaupt zu vermeiden. Auf meinem System wird das Protokoll gespeichert /var/cron/logund sieht folgendermaßen aus:

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

Diese Zeile sagt mir , dass die cron - Instanz mit PID 20232 auf der Maschine fortressausgeführt werden /home/vucar/lighttpd-watchdogim Namen des Benutzers vucar. Auf einem gut funktionierenden System läuft nur ein einziger Cron. Dies ist also unkompliziert.

Dies funktioniert auch für atJobs, da diese normalerweise sowieso nur an cron übergeben werden:

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

Die Snippets stammen aus einem BSD-System, aber das allgemeine Konzept ist wahrscheinlich überall gleich.

Vucar Timnärakrul
quelle